本書旨在指導(dǎo)大家優(yōu)化運(yùn)行在現(xiàn)代CPU上的應(yīng)用程序的性能。具體來說,主要分為兩部分內(nèi)容:
? 第一部分介紹性能分析,包括對(duì)CPU微架構(gòu)、術(shù)語和指標(biāo)的簡(jiǎn)要概述,還探討了分析性能的不同方法和現(xiàn)代平臺(tái)上可用的硬件監(jiān)控功能。
? 第二部分展示如何發(fā)現(xiàn)優(yōu)化機(jī)會(huì),以及可以做哪些轉(zhuǎn)換來提高程序的性能。此外,還提供了一份可應(yīng)用于用戶應(yīng)用程序的優(yōu)化清單,包括循環(huán)優(yōu)化、向量化、函數(shù)內(nèi)聯(lián)等,并討論了有助于消除CPU微架構(gòu)層面的問題(如緩存未命中、分支預(yù)測(cè)錯(cuò)誤等)的代碼轉(zhuǎn)換。
本書對(duì)于從事性能關(guān)鍵型應(yīng)用程序開發(fā)和進(jìn)行系統(tǒng)底層優(yōu)化的技術(shù)人員來說是不可或缺的。對(duì)于任何想更好地了解應(yīng)用程序性能并探索其診斷和改進(jìn)方法的開發(fā)者來說,這本書也很有用。
Preface?目 錄
譯者序
前言
致謝
作者簡(jiǎn)介
第1章?導(dǎo)讀1
1.1?為什么需要性能調(diào)優(yōu)2
1.2?誰需要做性能調(diào)優(yōu)5
1.3?什么是性能分析7
1.4?本書的主要內(nèi)容8
1.5?本書不包含什么內(nèi)容9
1.6?本章總結(jié)10
第一部分?現(xiàn)代CPU性能分析
第2章?性能測(cè)量12
2.1?現(xiàn)代系統(tǒng)中的噪聲13
2.2?生產(chǎn)環(huán)境中的性能測(cè)量15
2.3?自動(dòng)檢測(cè)性能退化問題16
2.4?手動(dòng)性能測(cè)試18
2.5?軟件計(jì)時(shí)器和硬件計(jì)時(shí)器22
2.6?微基準(zhǔn)測(cè)試24
2.7?本章總結(jié)25
第3章?CPU微架構(gòu)27
3.1?指令集架構(gòu)27
3.2?流水線28
3.3?利用指令級(jí)并行30
3.3.1?亂序執(zhí)行30
3.3.2?超標(biāo)量引擎和超長(zhǎng)指令字31
3.3.3?投機(jī)執(zhí)行33
3.4?利用線程級(jí)并行34
3.5?存儲(chǔ)器層次35
3.5.1?高速緩存層次35
3.5.2?主存39
3.6?虛擬內(nèi)存39
3.7?單指令多數(shù)據(jù)多處理器40
3.8?現(xiàn)代CPU設(shè)計(jì)42
3.8.1?CPU前端42
3.8.2?CPU后端44
3.9?性能監(jiān)控單元44
第4章?性能分析中的術(shù)語和指標(biāo)47
4.1?退休指令與執(zhí)行指令47
4.2?CPU利用率48
4.3?CPI和IPC48
4.4?微操作49
4.5?流水線槽位51
4.6?核時(shí)鐘周期和參考時(shí)鐘周期51
4.7?緩存未命中52
4.8?分支預(yù)測(cè)錯(cuò)誤53
第5章?性能分析方法55
5.1?代碼插樁56
5.2?跟蹤58
5.3?負(fù)載表征59
5.3.1?統(tǒng)計(jì)性能事件59
5.3.2?手動(dòng)收集性能計(jì)數(shù)60
5.3.3?事件多路復(fù)用和縮放62
5.4?采樣63
5.4.1?用戶模式采樣和基于硬件
事件的采樣64
5.4.2?尋找熱點(diǎn)64
5.4.3?采集調(diào)用棧66
5.4.4?火焰圖69
5.5?屋頂線性能模型69
5.6?靜態(tài)性能分析73
5.7?編譯器優(yōu)化報(bào)告75
5.8?本章總結(jié)78
第6章?性能分析相關(guān)的CPU特性80
6.1?自頂向下微架構(gòu)分析技術(shù)81
6.1.1?Intel VTune Prof iler中的
TMA84
6.1.2?Linux perf中的TMA85
6.1.3?第一步:確定瓶頸86
6.1.4?第二步:定位具體的代碼
位置88
6.1.5?第三步:解決問題90
6.1.6?小結(jié)91
6.2?后分支記錄92
6.2.1?采集LBR棧94
6.2.2?獲取調(diào)用圖95
6.2.3?識(shí)別熱點(diǎn)分支96
6.2.4?分析分支預(yù)測(cè)錯(cuò)誤率97
6.2.5?機(jī)器碼的準(zhǔn)確計(jì)時(shí)98
6.2.6?評(píng)估分支輸出的概率100
6.2.7?其他應(yīng)用場(chǎng)景101
6.3?基于處理器事件的采樣101
6.3.1?精準(zhǔn)事件102
6.3.2?降低采樣開銷103
6.3.3?分析內(nèi)存訪問104
6.4?Intel處理器跟蹤技術(shù)105
6.4.1?工作流105
6.4.2?時(shí)間報(bào)文106
6.4.3?采集和解析跟蹤文件107
6.4.4?用法108
6.4.5?磁盤空間和解析時(shí)間109
6.5?本章總結(jié)110
第二部分?基于源代碼的
CPU調(diào)優(yōu)
第7章?CPU前端優(yōu)化117
7.1 機(jī)器碼布局118
7.2 基本塊118
7.3 基本塊布局119
7.4 基本塊對(duì)齊121
7.5 函數(shù)拆分123
7.6 函數(shù)分組125
7.7 基于剖析文件的編譯優(yōu)化126
7.8 對(duì)ITLB的優(yōu)化128
7.9 本章總結(jié)128
第8章?CPU后端優(yōu)化130
8.1 內(nèi)存綁定130
8.1.1 緩存友好的數(shù)據(jù)結(jié)構(gòu)131
8.1.2 顯式內(nèi)存預(yù)取136
8.1.3 針對(duì)DTLB優(yōu)化138
8.2 核心綁定141
8.2.1 函數(shù)內(nèi)聯(lián)141
8.2.2 循環(huán)優(yōu)化143
8.2.3 向量化149
8.3 本章總結(jié)158
第9章?優(yōu)化錯(cuò)誤投機(jī)160
9.1 用查表替換分支161
9.2 用斷言替換分支162
9.3 本章總結(jié)164
第10章?其他調(diào)優(yōu)165
10.1 編譯時(shí)計(jì)算165
10.2 編譯器內(nèi)建函數(shù)166
10.3 緩存預(yù)熱167
10.4 減少慢速浮點(diǎn)運(yùn)算168
10.5 系統(tǒng)調(diào)優(yōu)169
第11章?優(yōu)化多線程應(yīng)用程序171
11.1 性能擴(kuò)展和開銷171
11.2 并行效率指標(biāo)174
11.2.1 有效CPU利用率174
11.2.2 線程數(shù)量174
11.2.3 等待時(shí)間175
11.2.4 自旋時(shí)間175
11.3 使用Intel VTune Profiler進(jìn)行
分析175
11.3.1 尋找耗時(shí)鎖175
11.3.2 平臺(tái)視圖178
11.4 使用Linux perf進(jìn)行分析178
11.5 使用Coz進(jìn)行分析181
11.6 使用eBPF和GAPP進(jìn)行分析181
11.7 檢測(cè)一致性問題182
11.7.1 緩存一致性協(xié)議182
11.7.2 真共享184
11.7.3 偽共享184
11.8 本章總結(jié)186
附錄A?減少測(cè)量噪聲188
附錄B?LLVM向量化程序193
跋198
術(shù)語200
參考文獻(xiàn)20