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