現(xiàn)代CPU性能分析與優(yōu)化
鏈接:https://pan.baidu.com/s/1Aa63_UQcdnRqm4WLFtUVMg?pwd=71x0?
提取碼:71x0

編輯推薦
適讀人群 :從事性能關(guān)鍵型應(yīng)用程序開發(fā)和進(jìn)行系統(tǒng)底層優(yōu)化的技術(shù)人員; 任何想更好地了解應(yīng)用程序性能并探索其診斷和改進(jìn)方法的開發(fā)者
我們生活在充滿數(shù)據(jù)的世界,每日都會(huì)生成大量數(shù)據(jù)。日益頻繁的信息交換催生了人們對(duì)快速軟件和快速硬件的需求。遺憾的是,現(xiàn)代CPU無法像以往那樣在單核性能方面有很大的提高。以往40多年來,性能調(diào)優(yōu)變得越來越重要,軟件調(diào)優(yōu)是未來提高性能的關(guān)鍵因素之一。作為軟件開發(fā)者,我們必須能夠優(yōu)化自己的應(yīng)用程序代碼。
本書融合了谷歌、Facebook等多位行業(yè)專家的知識(shí),是從事性能關(guān)鍵型應(yīng)用程序開發(fā)和系統(tǒng)底層優(yōu)化的技術(shù)人員必備的參考書,可以幫助開發(fā)者理解所開發(fā)的應(yīng)用程序的性能表現(xiàn),學(xué)會(huì)尋找并去除低效代碼。
內(nèi)容簡介
本書旨在指導(dǎo)大家優(yōu)化運(yùn)行在現(xiàn)代CPU上的應(yīng)用程序的性能。具體來說,主要分為兩部分內(nèi)容:
第一部分介紹性能分析,包括對(duì)CPU微架構(gòu)、術(shù)語和指標(biāo)的簡要概述,還探討了分析性能的不同方法和現(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ā)者來說,這本書也很有用。
作者簡介
作者簡介:
丹尼斯·巴赫瓦洛夫(Denis Bakhvalov)
Intel高級(jí)開發(fā)人員,在Intel從事C++編譯器項(xiàng)目相關(guān)工作,致力于為不同的芯片架構(gòu)生成最佳代碼。性能工程和編譯器一直是他感興趣的研究領(lǐng)域。他于2008年開始了他的軟件開發(fā)職業(yè)生涯,參與過多個(gè)領(lǐng)域的工作,包括桌面應(yīng)用程序開發(fā)、嵌入式系統(tǒng)開發(fā)、性能分析和編譯器開發(fā)。2016年,他開設(shè)了easyperf.net博客,開始在博客中撰寫性能分析、調(diào)優(yōu)、C/C++編譯器和CPU微架構(gòu)相關(guān)的文章。
譯者簡介:
朱金鵬 榮耀終端虛擬機(jī)和編譯優(yōu)化技術(shù)負(fù)責(zé)人,有10多年安卓系統(tǒng)開發(fā)經(jīng)驗(yàn),致力于安卓手機(jī)系統(tǒng)的性能優(yōu)化。曾就職于華為終端,負(fù)責(zé)方舟編譯器關(guān)鍵特性設(shè)計(jì)與開發(fā),主導(dǎo)WebAssembly技術(shù)在輕量級(jí)操作系統(tǒng)上的應(yīng)用。他是《簡明的TensorFlow2》的合著者。
李成棟 騰訊軟硬件協(xié)同架構(gòu)師,有7年性能分析優(yōu)化實(shí)踐經(jīng)驗(yàn),擅長軟硬件協(xié)同性能分析與優(yōu)化,主導(dǎo)過多款性能優(yōu)化平臺(tái)/工具的建設(shè),曾就職于阿里巴巴基礎(chǔ)軟件系統(tǒng)性能團(tuán)隊(duì)。
精彩書評(píng)
“這是一本極好的書,每個(gè)對(duì)軟件性能感興趣的人都應(yīng)該擁有一本。它對(duì)性能優(yōu)化進(jìn)行了深入、透徹且準(zhǔn)確的研究。”——Daniel Lemire,計(jì)算機(jī)科學(xué)教授
“我強(qiáng)烈推薦這本書。它讓許多工程師變得更輕松。”——Jumana Mundichipparakkal,性能工程師
“本書包含所有理解應(yīng)用程序性能剖析文件以及性能測(cè)量和性能改善方法所需的重要概念、信息及工具。”——Arun S. Kumar,高級(jí)軟件工程師
目錄
譯者序
前言
致謝
作者簡介
第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)量引擎和超長指令字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
查看全部↓
前言/序言
Preface 前 言
寫作目的
我寫這本書的目的很簡單:幫助軟件開發(fā)人員更好地理解應(yīng)用程序在現(xiàn)代硬件上的性能。我知道,對(duì)于初學(xué)者甚至資深的開發(fā)人員來說,該話題可能會(huì)讓他們感到困惑,這種困惑主要發(fā)生在沒有從事過與性能相關(guān)的工作的開發(fā)人員身上。不過這并不是問題,畢竟所有的專家都曾是初學(xué)者。
我至今還記得剛開始進(jìn)行性能分析的那些日子:盯著不熟悉的指標(biāo),試圖匹配一些不匹配的數(shù)據(jù),每日都感到非常困惑。我花了好幾年的時(shí)間才終于融會(huì)貫通,把相關(guān)的知識(shí)拼圖拼湊到了一起。當(dāng)時(shí),唯一的信息來源是軟件開發(fā)者手冊(cè),但是它不是主流開發(fā)者喜歡閱讀的文檔。所以,我決定寫這本書,希望本書能夠讓開發(fā)人員更容易地學(xué)習(xí)性能分析的相關(guān)概念。
認(rèn)為自己是性能分析初學(xué)者的開發(fā)者,可以從本書的開頭逐章閱讀。第2~4章為開發(fā)者提供了閱讀后面各章所需的必備知識(shí),已經(jīng)熟悉這些概念的讀者可以選擇跳過這些章節(jié)。此外,本書可用作優(yōu)化軟件應(yīng)用程序的參考指南。讀者可把第7~11章的內(nèi)容作為調(diào)優(yōu)代碼的靈感來源。