現代 CPU 性能分析與優化 Performance Analysis and Tuning on Modern CPUs: Squeeze the last bit of performance from your application.

Denis Bakhvalov 朱金鵬,李成棟 譯

買這商品的人也買了...

商品描述

本書旨在指導大家優化運行在現代CPU上的應用程序的性能。
具體來說,主要分為兩部分內容:
第一部分介紹性能分析,包括對CPU微架構、術語和指標的簡要概述,
還探討了分析性能的不同方法和現代平台上可用的硬件監控功能。
第二部分展示如何發現優化機會,以及可以做哪些轉換來提高程序的性能。
此外,還提供了一份可應用於用戶應用程序的優化清單,
包括循環優化、向量化、函數內聯等,並討論了有助於消除CPU微架構層面的問題(如緩存未命中、分支預測錯誤等)的代碼轉換。
本書對於從事性能關鍵型應用程序開發和進行系統底層優化的技術人員來說是不可或缺的。
對於任何想更好地了解應用程序性能並探索其診斷和改進方法的開發者來說,這本書也很有用。

作者簡介

Denis Bakhvalov
Intel高級開發人員,在Intel從事C++編譯器項目相關工作,致力於為不同的芯片架構生成最佳代碼。
性能工程和編譯器一直是他感興趣的研究領域。
他於2008年開始了他的軟件開發職業生涯,參與過多個領域的工作,
包括桌面應用程序開發、嵌入式系統開發、性能分析和編譯器開發。
2016年,他開設了easyperf.net博客,開始在博客中撰寫性能分析、調優、C/C++編譯器和CPU微架構相關的文章。

朱金鵬
榮耀終端虛擬機和編譯優化技術負責人,有10多年安卓系統開發經驗,致力於安卓手機系統的性能優化。
曾就職於華為終端,負責方舟編譯器關鍵特性設計與開發,
主導WebAssembly技術在輕量級操作系統上的應用。
他是《簡明的TensorFlow2》的合著者。

李成棟
騰訊軟硬件協同架構師,有7年性能分析優化實踐經驗,
擅長軟硬件協同性能分析與優化,
主導過多款性能優化平台/工具的建設,曾就職於阿里巴巴基礎軟件系統性能團隊。

目錄大綱

譯者序
前言
致謝
作者簡介
第1章導讀1
1.1 為什麼需要性能調優2
1.2 誰需要做性能調優5
1.3 什麼是性能分析7
1.4 本書的主要內容8
1.5 本書不包含什麼內容9
1.6 本章總結10
第一部分現代CPU性能分析
第2章性能測量12
2.1 現代系統中的噪聲13
2.2 生產環境中的性能測量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 亂序執行30
3.3.2 超標量引擎和超長指令字31
3.3.3 投機執行33
3.4 利用線程級並行34
3.5 存儲器層次35
3.5.1 高速緩存層次35
3.5.2 主存39
3.6 虛擬內存39
3.7 單指令多數據多處理器40
3.8 現代CPU設計42
3.8.1 CPU前端42
3.8.2 CPU後端44
3.9 性能監控單元44
第4章性能分析中的術語和指標47
4.1 退休指令與執行指令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 統計性能事件59
5.3.2 手動收集性能計數60
5.3.3 事件多路復用和縮放62
5.4 採樣63
5.4.1 用戶模式採樣和基於硬件
事件的採樣64
5.4.2 尋找熱點64
5.4.3 採集調用棧66
5.4.4 火焰圖69
5.5 屋頂線性能模型69
5.6 靜態性能分析73
5.7 編譯器優化報告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 獲取調用圖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 分析內存訪問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調優
第7章CPU前端優化117
7.1 機器碼佈局118
7.2 基本塊118
7.3 基本塊佈局119
7.4 基本塊對齊121
7.5 函數拆分123
7.6 函數分組125
7.7 基於剖析文件的編譯優化126
7.8 對ITLB的優化128
7.9 本章總結128
第8章CPU後端優化130
8.1 內存綁定130
8.1.1 緩存友好的數據結構131
8.1.2 顯式內存預取136
8.1.3 針對DTLB優化138
8.2 核心綁定141
8.2.1 函數內聯141
8.2.2 循環優化143
8.2.3 向量化149
8.3 本章總結158
第9章優化錯誤投機160
9.1 用查表替換分支161
9.2 用斷言替換分支162
9.3 本章總結164
第10章其他調優165
10.1 編譯時計算165
10.2 編譯器內建函數166
10.3 緩存預熱167
10.4 減少慢速浮點運算168
10.5 系統調優169
第11章優化多線程應用程序171
11.1 性能擴展和開銷171
11.2 並行效率指標174
11.2.1 有效CPU利用率174
11.2.2 線程數量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 緩存一致性協議182
11.7.2 真共享184
11.7.3 偽共享184
11.8 本章總結186
附錄A 減少測量噪聲188
附錄B LLVM向量化程序193
跋198
術語200
參考文獻20