本書詳細介紹了軟件系統(tǒng)優(yōu)化的原理、技術(shù)和常用方法。本書強調(diào)從系統(tǒng)視角進行優(yōu)化,提出了數(shù)據(jù)驅(qū)動的系統(tǒng)優(yōu)化方法,圍繞軟件 硬件 數(shù)據(jù)三個方面展開講解。本書共 18 章,分為五個部分。第1章和第2章從一個性能優(yōu)化案例引入,概述了軟件系統(tǒng)優(yōu)化的方法論。第二部分包括第 3~6 章,介紹了性能工程的基礎(chǔ)知識。第三部分包括第 7~10 章,介紹了計算機體系結(jié)構(gòu)優(yōu)化的相關(guān)知識。第四部分包括第 11~16 章,介紹了編譯優(yōu)化的相關(guān)知識。第五部分包括第17章和第18 章,針對新興場景下的系統(tǒng)優(yōu)化技術(shù)展開專題討論。
本書基于作者豐富的教學和工程實踐經(jīng)驗,創(chuàng)新性地提出了軟件系統(tǒng)優(yōu)化的方法論,從性能工程基礎(chǔ)、編譯優(yōu)化、計算機體系結(jié)構(gòu)優(yōu)化等傳統(tǒng)技術(shù)到數(shù)據(jù)中心優(yōu)化、深度學習框架優(yōu)化等新興技術(shù),全面、深入地闡述了軟件系統(tǒng)優(yōu)化的理論方法與實用技術(shù)。本書可以幫助讀者貫穿計算機系統(tǒng)的多個層次的知識,培養(yǎng)系統(tǒng)觀和優(yōu)化思維,鍛煉軟件系統(tǒng)優(yōu)化的綜合能力。本書還配備了大量的實驗代碼與性能測量案例,可以幫助讀者培養(yǎng)實際動手能力,從實踐中積累系統(tǒng)優(yōu)化的經(jīng)驗。
前 言
起源
本書是根據(jù)郭健美、黃波從2021年秋天起在華東師范大學數(shù)據(jù)科學與工程學院開設(shè)的軟件系統(tǒng)優(yōu)化課程的講義總結(jié)而成的,該課程主要面向高年級本科生和低年級研究生講授軟件系統(tǒng)的性能優(yōu)化。
性能是衡量軟件系統(tǒng)質(zhì)量和競爭力的一個重要方面,也是軟件系統(tǒng)設(shè)計、開發(fā)和應(yīng)用過程中必須關(guān)注的一個基本屬性。如何在給定的硬件資源配置下提升軟件系統(tǒng)的性能,是數(shù)字化系統(tǒng)的設(shè)計和實現(xiàn)過程中必須思考和解決的問題,也是優(yōu)化利用軟硬件資源的有效途徑。
每一位卓越的軟件系統(tǒng)工程師、架構(gòu)師或研究人員都應(yīng)掌握軟件系統(tǒng)優(yōu)化的原理與技術(shù)。開設(shè)軟件系統(tǒng)優(yōu)化方面的課程是解決我國計算機系統(tǒng)卡脖子問題所需人才的有效措施。我們力求在訓練相關(guān)人員解決實際問題的過程中圍繞優(yōu)化思維培養(yǎng)系統(tǒng)觀和工程能力,鍛煉邏輯思維、批判性思維和創(chuàng)造性思維。
內(nèi)容
本書包括18章,分為五個部分。第一部分包括第1章和第2章,作為緒論,先介紹一個性能優(yōu)化案例,再概述軟件系統(tǒng)優(yōu)化的方法論。第二部分包括第3~6章,主要介紹性能工程的基礎(chǔ)知識。第三部分包括第7~10章,介紹計算機體系結(jié)構(gòu)優(yōu)化的相關(guān)知識。第四部分包括第11~16章,介紹編譯優(yōu)化的相關(guān)知識。第五部分包括第17章和第18章,主要針對新興場景下的系統(tǒng)優(yōu)化技術(shù)進行專題討論。
本書適合高年級本科生、研究生或相關(guān)工程技術(shù)人員學習。在使用本書講授課程時,建議讀者先學習如下課程:計算機程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)、算法設(shè)計與分析、計算機系統(tǒng)。此外,如讀者能先修編譯原理、計算機組成與體系結(jié)構(gòu)等課程,就能更好地理解和掌握本書內(nèi)容。教師可根據(jù)課程要求、個人喜好、學生的背景和能力選講部分或全部章節(jié)。書中各章都給出了思考題,用于幫助讀者鞏固知識和引導讀者擴展知識面。
讀者可以從https://solelab.tech/sso獲得與本書相關(guān)的更多資料,包括本書樣例程序的源代碼,以及軟件系統(tǒng)優(yōu)化課程的課件、上機作業(yè)、實踐項目等。
致謝
筆者在開設(shè)軟件系統(tǒng)優(yōu)化課程之初,著重參考了以下兩門課程的教學設(shè)計和內(nèi)容:麻省理工學院的MIT 6.172Performance Engineering of Software Systems、圣路易斯華盛頓大學的WUSTL CSE567MComputer Systems Analysis。這兩門課程對本書的內(nèi)容組織產(chǎn)生了重要影響,在此向這兩門課程的授課教師Charles E. Leiserson、Julian Shun、Raj Jain等表示感謝。
本書由郭健美、黃波先根據(jù)授課講義和學生反饋確定本書的整體結(jié)構(gòu)和各個章節(jié)的大綱,然后分工撰寫初稿,部分章節(jié)由Intel公司的林曉東、趙鵬編寫,華東師范大學系統(tǒng)優(yōu)化實驗室的研究生劉通宇、梁文輝、李寧、廖浩宇參與了本書的編寫準備工作。具體分工如下:第1章由郭健美編寫,第2章由郭健美、黃波編寫,第3~8章由劉通宇、郭健美編寫,第9章和第17章由郭健美編寫,第10章由趙鵬編寫,第11~16章由黃波編寫,第18章由林曉東編寫。李寧、廖浩宇協(xié)助整理了部分文本、插圖和參考文獻。全書的編寫通過審閱修改、交叉評審、逐步迭代的方式完成。
本書的成稿離不開Intel公司相關(guān)專家的支持,林曉東、趙鵬分別作為華東師范大學的兼職教授、兼職副教授于2022年開始參與軟件系統(tǒng)優(yōu)化課程的授課,并在工作之余編寫了相關(guān)章節(jié)。
感謝清華大學陳文光教授和上海交通大學陳海波教授在百忙中閱讀了本書初稿,提出了寶貴的修改意見,并幫忙作序。
感謝機械工業(yè)出版社的各位編輯,他們耐心細致的工作確保本書得以順利出版。
軟件系統(tǒng)優(yōu)化涉及的知識內(nèi)容廣泛,罕有人士對其眾多分支領(lǐng)域均有精深理解。由于筆者學識水平有限,書中難免存在錯謬,懇請讀者和同行批評指正,我們將不勝感激。
CONTENTS
目 錄
推薦序一
推薦序二
前言
第一部分 緒論
第1章 開篇案例:矩陣乘法的性能
優(yōu)化 2
1.1 不同編程語言的實現(xiàn) 2
1.2 循環(huán)交換 5
1.3 編譯器的不同優(yōu)化級別 7
1.4 多核并行優(yōu)化 8
1.5 循環(huán)分塊 11
1.6 內(nèi)建函數(shù) 15
1.7 本章小結(jié) 17
1.8 思考題 18
第2章 系統(tǒng)優(yōu)化方法論概述 19
2.1 后摩爾時代性能優(yōu)化的驅(qū)動力 19
2.2 數(shù)據(jù)驅(qū)動的系統(tǒng)優(yōu)化方法 21
2.3 從單點到全局的系統(tǒng)觀 21
2.4 本章小結(jié) 23
2.5 思考題 23
第二部分 性能工程基礎(chǔ)
第3章 性能測量 26
3.1 測量方法 26
3.1.1 外部測量 27
3.1.2 內(nèi)部測量 28
3.1.3 仿真測量 29
3.2 計時器的選擇 30
3.3 數(shù)據(jù)收集策略 33
3.3.1 計數(shù)型 33
3.3.2 采樣型 35
3.3.3 追蹤型 37
3.4 性能波動 38
3.5 測量開銷 42
3.6 測量誤差 43
3.7 本章小結(jié) 44
3.8 思考題 44
第4章 基準評測 45
4.1 基準評測程序 45
4.1.1 單一指令 46
4.1.2 指令組合 46
4.1.3 合成程序 47
4.1.4 程序內(nèi)核 47
4.1.5 微基準評測程序 47
4.1.6 應(yīng)用基準評測程序 48
4.2 標準化基準評測套件 48
4.2.1 SPEC CPU 2017 49
4.2.2 基準評測套件的開發(fā)
標準 51
4.3 基準評測的策略 52
4.3.1 固定計算的基準評測 52
4.3.2 固定時間的基準評測 52
4.3.3 可變計算和可變時間的
基準評測 53
4.4 阿姆達爾定律 53
4.5 古斯塔夫森定律 54
4.6 本章小結(jié) 55
4.7 思考題 56
第5章 配置優(yōu)化 57
5.1 基本概念 57
5.2 技術(shù)挑戰(zhàn) 59
5.2.1 配置空間的組合爆炸 59
5.2.2 性能測量的高昂代價 60
5.2.3 復(fù)雜隱蔽的特征交互 61
5.3 實驗設(shè)計 62
5.3.1 單次單因子設(shè)計 62
5.3.2 全因子設(shè)計 62
5.3.3 部分因子設(shè)計 63
5.3.4 2kr因子設(shè)計 64
5.3.5 隨機搜索 69
5.3.6 自動調(diào)優(yōu) 70
5.4 基于機器學習的方法 70
5.5 領(lǐng)域知識驅(qū)動的方法 72
5.6 本章小結(jié) 73
5.7 思考題 73
第6章 性能評價 74
6.1 評價目標的設(shè)定 74
6.2 評價方法的選擇 75
6.2.1 評價方法的選擇條件 75
6.2.2 評價方法的優(yōu)缺點 76
6.3 評價指標的選擇 77
6.3.1 評價指標的分類 77
6.3.2 評價指標的選擇條件 78
6.3.3 量綱分析與合理性檢查 78
6.4 數(shù)據(jù)的分析與解釋 79
6.4.1 數(shù)據(jù)的匯總 79
6.4.2 數(shù)據(jù)的比較 81
6.5 常見錯誤與規(guī)避方法 87
6.6 本章小結(jié) 88
6.7 思考題 88
第三部分 計算機體系結(jié)構(gòu)優(yōu)化
第7章 處理器優(yōu)化 90
7.1 五階段處理器 90
7.2 流水線執(zhí)行 93
7.2.1 指令流水線 93
7.2.2 前端與后端 94
7.2.3 流水線的性能評價和
細分 94
7.2.4 流水線的停頓與冒險 95
7.3 超標量處理 96
7.3.1 超標量指令流水線 96
7.3.2 機器指令與微操作 98
7.4 亂序執(zhí)行 99
7.4.1 數(shù)據(jù)依賴的分類 99
7.4.2 旁路 99
7.4.3 順序執(zhí)行與亂序執(zhí)行 100
7.4.4 寄存器重命名 102
7.5 推測執(zhí)行 103
7.5.1 條件分支造成的控制
冒險 103
7.5.2 分支預(yù)測器 104
7.6 本章小結(jié) 105
7.7 思考題 105
第8章 存儲器優(yōu)化 106
8.1 高速緩存 108
8.1.1 存儲器的層次結(jié)構(gòu) 108
8.1.2 高速緩存的組織結(jié)構(gòu) 109
8.1.3 緩存預(yù)取 111
8.2 多核訪存架構(gòu) 113
8.2.1 多處理器系統(tǒng)架構(gòu) 113
8.2.2 異構(gòu)系統(tǒng)架構(gòu) 115
8.2.3 緩存一致性 116
8.3 編寫緩存友好的代碼 120
8.3.1 順序訪問數(shù)據(jù) 120
8.3.2 數(shù)據(jù)打包 121
8.3.3 對齊與填充 121
8.4 本章小結(jié) 123
8.5 思考題 123
第9章 微體系結(jié)構(gòu)性能分析 124
9.1 處理器性能的鐵律 124
9.1.1 優(yōu)化每時鐘周期的時長 125
9.1.2 優(yōu)化指令路徑長度 126
9.1.3 優(yōu)化CPI 128
9.2 CPI分解方法 129
9.2.1 根據(jù)不同類型的指令進行
CPI分解 129
9.2.2 根據(jù)不同停頓進行CPI
分解 130
9.3 自頂向下的微體系結(jié)構(gòu)分析
方法 132
9.4 本章小結(jié) 134
9.5 思考題 135
第10章 異構(gòu)計算與編程 136
10.1 異構(gòu)計算概述 136
10.1.1 體系結(jié)構(gòu)的分類 136
10.1.2 異構(gòu)計算的特性 138
10.2 并行編程框架 139
10.2.1 多核編程 139
10.2.2 多節(jié)點編程 144
10.3 異構(gòu)編程:SYCL 148
10.3.1 硬件設(shè)備抽象:設(shè)備和
隊列 148
10.3.2 數(shù)據(jù)訪問方法 149
10.3.3 并行性表達 150
10.3.4 軟硬件結(jié)合 151
10.3.5 案例分析:矩陣乘法 153
10.4 本章小結(jié) 155
10.5 思考題 155
第四部分 編譯優(yōu)化
第11章 源程序級別的常見優(yōu)化
方法 158
11.1 程序的工作量 158
11.2 數(shù)據(jù)結(jié)構(gòu)優(yōu)化示例 159
11.2.1 打包和編碼 159
11.2.2 數(shù)據(jù)增添 160
11.2.3 預(yù)先計算 161
11.2.4 編譯時做初始化 162
11.2.5 緩存 163
11.2.6 稀疏性 164
11.3 程序邏輯優(yōu)化 166
11.3.1 常數(shù)折疊與傳播 167
11.3.2 公共子表達式消除 167
11.3.3 代數(shù)恒等替換 167
11.3.4 創(chuàng)建快速通道 168
11.3.5 邏輯短路 168
11.3.6 判斷順序 170
11.3.7 組合判斷 170
11.4 循環(huán)優(yōu)化 171
11.4.1 循環(huán)不變量外提 172
11.4.2 設(shè)置哨兵 172
11.4.3 循環(huán)展開 173
11.4.4 循環(huán)合并 173
11.4.5 消除無用迭代 174
11.5 函數(shù)優(yōu)化 174
11.5.1 函數(shù)內(nèi)聯(lián) 174
11.5.2 尾遞歸消除 175
11.5.3 粗化遞歸 176
11.6 本章小結(jié) 176
11.7 思考題 177
第12章 編譯器概述 178
12.1 編譯器的定義、分類及典型
架構(gòu) 178
12.1.1 編譯器的定義與分類 178
12.1.2 編譯器的典型架構(gòu) 181
12.1.3 程序中間表示的
必要性 182
12.1.4 程序中間表示的設(shè)計
思考 183
12.1.5 LLVM IR:LLVM的程序中間表示 184
12.2 符號表 187
12.3 程序運行時的內(nèi)存組織 188
12.4 程序分析和優(yōu)化 189
12.5 交叉編譯 191
12.6 用編譯器優(yōu)化程序的迭代
循環(huán) 192
12.7 本章小結(jié) 193
12.8 思考題 193
第13章 目標指令集架構(gòu)與匯編
語言 194
13.1 編譯與匯編語言 194
13.2 x86-64指令集架構(gòu) 197
13.2.1 數(shù)據(jù)類型 197
13.2.2 寄存器 198
13.2.3 指令 200
13.2.4 尋址方式 202
13.3 常用的匯編指令模式 204
13.4 浮點和向量化指令 205
13.4.1 浮點運算指令 205
13.4.2 向量化指令 206
13.5 本章小結(jié) 208
13.6 思考題 208
第14章 C程序的匯編代碼生成 209
14.1 C程序是如何被轉(zhuǎn)換成匯編
代碼的 209
14.2 C程序轉(zhuǎn)換成LLVM IR 210
14.2.1 直線代碼到LLVM IR的
轉(zhuǎn)換 211
14.2.2 C函數(shù)到LLVM IR的
轉(zhuǎn)換 212
14.2.3 條件分支語句到LLVM IR的轉(zhuǎn)換 213
14.2.4 循環(huán)語句到LLVM IR的
轉(zhuǎn)換 215
14.2.5 LLVM IR中的屬性 217
14.2.6 小結(jié) 218
14.3 LLVM IR轉(zhuǎn)換成匯編程序 218
14.3.1 匯編制導指令與程序的
內(nèi)存布局 219
14.3.2 函數(shù)調(diào)用規(guī)范 220
14.4 本章小結(jié) 222
14.5 思考題 223
第15章 編譯器的優(yōu)化能力 225
15.1 編譯分析/優(yōu)化報告 225
15.2 編譯器常見的優(yōu)化能力 227
15.3 編譯優(yōu)化示例 228
15.3.1 標量優(yōu)化 230
15.3.2 結(jié)構(gòu)體優(yōu)化 232
15.3.3 函數(shù)調(diào)用優(yōu)化 234
15.3.4 循環(huán)優(yōu)化 236
15.4 編譯優(yōu)化的挑戰(zhàn) 238
15.4.1 靜態(tài)信息的不準確性 238
15.4.2 編譯單元的局限性 239
15.4.3 優(yōu)化順序的不唯一性 240
15.5 鏈接時間優(yōu)化 240
15.6 本章小結(jié) 241
15.7 思考題 242
第16章 程序插樁與優(yōu)化機會識別 243
16.1 什么是程序插樁 243
16.1.1 程序插樁應(yīng)用示例 244
16.1.2 程序插樁的手段 246
16.2 二進制翻譯助力程序插樁 246
16.3 利用插樁信息識別編譯優(yōu)化
機會 249
16.3.1 最原始的編譯器優(yōu)化
機會識別方法 249
16.3.2 常用的編譯優(yōu)化機會
識別方法 250
16.3.3 熱點驅(qū)動的半自動編譯
優(yōu)化機會識別框架 250
16.4 本章小結(jié) 257
16.5 思考題 257
第五部分 專題討論
第17章 數(shù)據(jù)中心的性能優(yōu)化 260
17.1 數(shù)據(jù)中心簡介 260
17.2 混部應(yīng)用的性能干擾檢修 261
17.3 數(shù)據(jù)中心的性能分析 264
17.4 數(shù)據(jù)中心的性能評價 267
17.5 本章小結(jié) 272
17.6 思考題 272
第18章 深度學習框架的優(yōu)化 273
18.1 深度學習框架簡介 273
18.2 優(yōu)化基礎(chǔ) 274
18.3 算子優(yōu)化 275
18.3.1 提高占用率 276
18.3.2 提高內(nèi)存帶寬的
利用率 277
18.3.3 使用(局部)共享
內(nèi)存 278
18.3.4 小結(jié) 278
18.4 基于計算圖的優(yōu)化 278
18.4.1 圖編譯器 279
18.4.2 圖編譯優(yōu)化 279
18.4.3 算子融合 280
18.4.4 MLIR簡介 281
18.4.5 小結(jié) 281
18.5 本章小結(jié) 282
18.6 思考題 282
參考文獻 283