本書詳細(xì)介紹了軟件系統(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ù)展開專題討論。
本書基于作者豐富的教學(xué)和工程實踐經(jīng)驗,創(chuàng)新性地提出了軟件系統(tǒng)優(yōu)化的方法論,從性能工程基礎(chǔ)、編譯優(yōu)化、計算機體系結(jié)構(gòu)優(yōu)化等傳統(tǒng)技術(shù)到數(shù)據(jù)中心優(yōu)化、深度學(xué)習(xí)框架優(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年秋天起在華東師范大學(xué)數(shù)據(jù)科學(xué)與工程學(xué)院開設(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)卡脖子問題所需人才的有效措施。我們力求在訓(xùn)練相關(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ù)人員學(xué)習(xí)。在使用本書講授課程時,建議讀者先學(xué)習(xí)如下課程:計算機程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)、算法設(shè)計與分析、計算機系統(tǒng)。此外,如讀者能先修編譯原理、計算機組成與體系結(jié)構(gòu)等課程,就能更好地理解和掌握本書內(nèi)容。教師可根據(jù)課程要求、個人喜好、學(xué)生的背景和能力選講部分或全部章節(jié)。書中各章都給出了思考題,用于幫助讀者鞏固知識和引導(dǎo)讀者擴展知識面。
讀者可以從https://solelab.tech/sso獲得與本書相關(guān)的更多資料,包括本書樣例程序的源代碼,以及軟件系統(tǒng)優(yōu)化課程的課件、上機作業(yè)、實踐項目等。
致謝
筆者在開設(shè)軟件系統(tǒng)優(yōu)化課程之初,著重參考了以下兩門課程的教學(xué)設(shè)計和內(nèi)容:麻省理工學(xué)院的MIT 6.172Performance Engineering of Software Systems、圣路易斯華盛頓大學(xué)的WUSTL CSE567MComputer Systems Analysis。這兩門課程對本書的內(nèi)容組織產(chǎn)生了重要影響,在此向這兩門課程的授課教師Charles E. Leiserson、Julian Shun、Raj Jain等表示感謝。
本書由郭健美、黃波先根據(jù)授課講義和學(xué)生反饋確定本書的整體結(jié)構(gòu)和各個章節(jié)的大綱,然后分工撰寫初稿,部分章節(jié)由Intel公司的林曉東、趙鵬編寫,華東師范大學(xué)系統(tǒng)優(yōu)化實驗室的研究生劉通宇、梁文輝、李寧、廖浩宇參與了本書的編寫準(zhǔn)備工作。具體分工如下:第1章由郭健美編寫,第2章由郭健美、黃波編寫,第3~8章由劉通宇、郭健美編寫,第9章和第17章由郭健美編寫,第10章由趙鵬編寫,第11~16章由黃波編寫,第18章由林曉東編寫。李寧、廖浩宇協(xié)助整理了部分文本、插圖和參考文獻(xiàn)。全書的編寫通過審閱修改、交叉評審、逐步迭代的方式完成。
本書的成稿離不開Intel公司相關(guān)專家的支持,林曉東、趙鵬分別作為華東師范大學(xué)的兼職教授、兼職副教授于2022年開始參與軟件系統(tǒng)優(yōu)化課程的授課,并在工作之余編寫了相關(guān)章節(jié)。
感謝清華大學(xué)陳文光教授和上海交通大學(xué)陳海波教授在百忙中閱讀了本書初稿,提出了寶貴的修改意見,并幫忙作序。
感謝機械工業(yè)出版社的各位編輯,他們耐心細(xì)致的工作確保本書得以順利出版。
軟件系統(tǒng)優(yōu)化涉及的知識內(nèi)容廣泛,罕有人士對其眾多分支領(lǐng)域均有精深理解。由于筆者學(xué)識水平有限,書中難免存在錯謬,懇請讀者和同行批評指正,我們將不勝感激。
郭健美,華東師范大學(xué)教授、博士生導(dǎo)師,研究興趣包括軟件系統(tǒng)的質(zhì)量保障和性能優(yōu)化。在上海交通大學(xué)獲得計算機應(yīng)用技術(shù)碩士、博士學(xué)位。曾在加拿大滑鐵盧大學(xué)擔(dān)任博士后、在華東理工大學(xué)擔(dān)任副教授、在阿里巴巴集團擔(dān)任高級技術(shù)專家。主持國家自然科學(xué)基金面上項目等科研項目,2017年入選上海市浦江人才計劃。曾獲得 ACM SIGSOFT杰出論文獎1次、國際會議最佳論文獎2次。2021年起主講軟件系統(tǒng)優(yōu)化計算機系統(tǒng)等課程。2023年,軟件系統(tǒng)優(yōu)化課程獲批上海高校市級重點課程。
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章 基準(zhǔn)評測 45
4.1 基準(zhǔn)評測程序 45
4.1.1 單一指令 46
4.1.2 指令組合 46
4.1.3 合成程序 47
4.1.4 程序內(nèi)核 47
4.1.5 微基準(zhǔn)評測程序 47
4.1.6 應(yīng)用基準(zhǔn)評測程序 48
4.2 標(biāo)準(zhǔn)化基準(zhǔn)評測套件 48
4.2.1 SPEC CPU 2017 49
4.2.2 基準(zhǔn)評測套件的開發(fā)
標(biāo)準(zhǔn) 51
4.3 基準(zhǔn)評測的策略 52
4.3.1 固定計算的基準(zhǔn)評測 52
4.3.2 固定時間的基準(zhǔn)評測 52
4.3.3 可變計算和可變時間的
基準(zhǔn)評測 53
4.4 阿姆達(dá)爾定律 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 基于機器學(xué)習(xí)的方法 70
5.5 領(lǐng)域知識驅(qū)動的方法 72
5.6 本章小結(jié) 73
5.7 思考題 73
第6章 性能評價 74
6.1 評價目標(biāo)的設(shè)定 74
6.2 評價方法的選擇 75
6.2.1 評價方法的選擇條件 75
6.2.2 評價方法的優(yōu)缺點 76
6.3 評價指標(biāo)的選擇 77
6.3.1 評價指標(biāo)的分類 77
6.3.2 評價指標(biāo)的選擇條件 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 流水線的性能評價和
細(xì)分 94
7.2.4 流水線的停頓與冒險 95
7.3 超標(biāo)量處理 96
7.3.1 超標(biāo)量指令流水線 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 并行性表達(dá) 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 公共子表達(dá)式消除 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章 目標(biāo)指令集架構(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 匯編制導(dǎo)指令與程序的
內(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 標(biāo)量優(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)信息的不準(zhǔn)確性 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章 深度學(xué)習(xí)框架的優(yōu)化 273
18.1 深度學(xué)習(xí)框架簡介 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
參考文獻(xiàn) 283