軟件優(yōu)化技術(shù) 陳虎 湯德佑 黃敏
定 價(jià):69 元
- 作者:陳虎 湯德佑 黃敏
- 出版時(shí)間:2024/3/1
- ISBN:9787111742456
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP311.5
- 頁(yè)碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書介紹了在現(xiàn)代計(jì)算機(jī)系統(tǒng)上充分利用微處理器計(jì)算能力以提高軟件性能的主要優(yōu)化方法,共分為七章。
本書闡明了底層技術(shù)對(duì)軟件性能的主要影響,介紹了豐富的軟件優(yōu)化方法和技巧,可以幫助軟件工程師提升編程水平,充分發(fā)揮現(xiàn)代CPU、GPU、I/O、操作系統(tǒng)、編譯器等底層系統(tǒng)的潛力。
從 2004 年開始,我們?cè)?Intel 公司的支持下開設(shè)了“多核軟件設(shè)計(jì)”課程,開始向本科生和碩士生講述多核處理器上的軟件優(yōu)化技術(shù)。在過(guò)去十多年中,我們一直在補(bǔ)充這門課程的教學(xué)內(nèi)容,逐漸涵蓋了 CPU 的一般軟件優(yōu)化技術(shù)、SIMD 軟件設(shè)計(jì)方法、GPU 體系結(jié)構(gòu)與軟件設(shè)計(jì)等多個(gè)方面。在此過(guò)程中,我們發(fā)現(xiàn)現(xiàn)有的教材還有很多需要提升的空間,主要體現(xiàn)在三個(gè)方面。
? 在現(xiàn)有計(jì)算機(jī)科學(xué)技術(shù)或軟件工程的課程體系中,計(jì)算機(jī)體系結(jié)構(gòu)(組成原理)、操作系統(tǒng)、編譯原理等底層技術(shù)相關(guān)課程的理論性很強(qiáng),且相對(duì)孤立,沒(méi)有體現(xiàn)出這些底層技術(shù)與軟件設(shè)計(jì)的關(guān)聯(lián)以及對(duì)軟件優(yōu)化的支持。
? 從計(jì)算機(jī)專業(yè)或軟件工程專業(yè)學(xué)生的編程能力培養(yǎng)角度看,現(xiàn)有的課程往往集中在算法的設(shè)計(jì)與優(yōu)化、軟件工程規(guī)范性等方面,缺少軟件性能工程方面的基本訓(xùn)練,使得學(xué)生所設(shè)計(jì)的軟件在性能方面難以滿足實(shí)際應(yīng)用的要求。
? 學(xué)生不了解現(xiàn)優(yōu) CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等底層系統(tǒng)硬件參數(shù),難以準(zhǔn)確估計(jì)系統(tǒng)的實(shí)際性能和及時(shí)預(yù)判可能存在的性能瓶頸,直接制約了軟件總體結(jié)構(gòu)設(shè)計(jì)及優(yōu)化的能力。
這些問(wèn)題促使我們撰寫一本將計(jì)算機(jī)體系結(jié)構(gòu)、操作系統(tǒng)、編譯器、虛擬機(jī)等底層技術(shù)與軟件優(yōu)化技術(shù)相關(guān)聯(lián)的教材,讓讀者能夠理解軟件優(yōu)化的基本方法以及這些方法背后的原理,并通過(guò)編程實(shí)踐掌握提升軟件性能的常見方法。與其他教材相比,本書具有以下特點(diǎn)。
? 融合了底層技術(shù)和軟件優(yōu)化技術(shù)兩個(gè)層面的內(nèi)容。介紹軟件優(yōu)化技術(shù)時(shí),分底層技術(shù)要點(diǎn)、軟件優(yōu)化基本方法、基于優(yōu)秀開源代碼或者學(xué)術(shù)論文的綜合實(shí)例分析三個(gè)部分進(jìn)行講解。通過(guò)這些內(nèi)容,讀者可以理解計(jì)算機(jī)底層技術(shù)對(duì)軟件性能的影響,掌握軟件優(yōu)化的基本方法,并學(xué)習(xí)實(shí)際系統(tǒng)中的應(yīng)用方法。
? 以編程實(shí)踐為核心。本書提供了較多的編程習(xí)題,核心目標(biāo)是提升讀者的編程能力。這些習(xí)題幾乎都來(lái)自計(jì)算機(jī)或軟件專業(yè)本科的常見算法或者實(shí)際工作生活中經(jīng)常遇見的問(wèn)題,方便讀者理解算法的背景和基本原理。通過(guò)對(duì)同一個(gè)問(wèn)題使用不同的軟件優(yōu)化技術(shù),讀者還可以對(duì)比不同優(yōu)化技術(shù)的效果。
本書分為七章,其中第 1 章介紹了軟件性能工程、延遲、吞吐率、加速比等基本概念和性能測(cè)試方法,后續(xù)章節(jié)圍繞著 6 個(gè)專題展開。每章的內(nèi)容既相對(duì)獨(dú)立,又相互有聯(lián)系。很多軟件優(yōu)化問(wèn)題往往需要綜合多章所介紹的技術(shù)逐步完成。
教師使用指導(dǎo)
在課程教學(xué)中,教師可以根據(jù)課時(shí)情況選擇本書的若干章或者專題講述底層技術(shù)的基本原理及基本優(yōu)化實(shí)例,也可以根據(jù)科研情況,講解其他程序優(yōu)化實(shí)例。其中第 1~4 章為本科生的基本教學(xué)內(nèi)容,第 5~7 章可以用于工程碩士研究生的知識(shí)擴(kuò)展。
在日常作業(yè)中,教師可以選擇書中的實(shí)驗(yàn)題作為編程作業(yè)。根據(jù)已有的教學(xué)實(shí)踐經(jīng)驗(yàn),本科學(xué)生每?jī)芍寥芸梢酝瓿梢粋(gè)較為復(fù)雜的軟件優(yōu)化作業(yè),并根據(jù)編程實(shí)驗(yàn)書寫完整的實(shí)驗(yàn)報(bào)告。教師可以聯(lián)系本書作者(chenhu@scut.edu.cn)以獲得本書實(shí)驗(yàn)題的參考程序。
本課程可以不進(jìn)行書面考試,而是以學(xué)生平時(shí)的實(shí)驗(yàn)報(bào)告作為評(píng)分依據(jù)。此外,可以考慮采用程序競(jìng)賽作為考試的形式,例如對(duì)同一個(gè)問(wèn)題(如矩陣乘法),根據(jù)學(xué)生所優(yōu)化程序的運(yùn)行時(shí)間長(zhǎng)短進(jìn)行排名和打分。這種方法可以更為有效地激勵(lì)學(xué)生進(jìn)行軟件優(yōu)化的熱情。
學(xué)生使用指導(dǎo)
在本課程中,學(xué)生需要通過(guò)大量的編程練習(xí)來(lái)提升自己的編程能力,加深對(duì)計(jì)算機(jī)底層技術(shù)的理解和認(rèn)識(shí)。在此過(guò)程中需要注意以下三點(diǎn)。
? 需要預(yù)先做好實(shí)驗(yàn)平臺(tái)的準(zhǔn)備,并充分了解實(shí)驗(yàn)平臺(tái)的技術(shù)參數(shù)。
? 需要重視實(shí)驗(yàn)報(bào)告的寫作。規(guī)范的實(shí)驗(yàn)報(bào)告便于交流技術(shù)思想,對(duì)實(shí)驗(yàn)數(shù)據(jù)的分析更能促進(jìn)讀者理解多種軟件優(yōu)化技術(shù)。
? 需要盡可能閱讀相關(guān)的參考文獻(xiàn),擴(kuò)展知識(shí)面。本書的篇幅有限,難以完整地涵蓋所有的技術(shù)細(xì)節(jié),需要讀者通過(guò)參考文獻(xiàn)進(jìn)一步提升自我學(xué)習(xí)的能力。
需要指出的是,由于作者水平和知識(shí)面有限,本書所列舉的優(yōu)化方法不一定是最新或者最好的,還需要讀者進(jìn)一步去探索。
本書的編著工作由本人完成,湯德佑老師和黃敏老師認(rèn)真審校了本書的主要內(nèi)容。感謝華為“智能基座”項(xiàng)目的支持。
最后,感謝家人的默默付出,感謝陳煥鑫、劉家輝、陳捷瑞、徐燁威等同學(xué)為本書所做的工作。
陳 虎
華南理工大學(xué)軟件學(xué)院
2023年8月
陳 虎
華南理工大學(xué)軟件學(xué)院副教授,長(zhǎng)期從事軟件優(yōu)化設(shè)計(jì)的科研和教學(xué)工作,承擔(dān)了國(guó)家重點(diǎn)研發(fā)計(jì)劃、國(guó)家自然科學(xué)基金重點(diǎn)項(xiàng)目等多項(xiàng)國(guó)家、省部級(jí)課題。具有超過(guò)十五年的專用高性能計(jì)算軟件開發(fā)經(jīng)驗(yàn),研制的高性能計(jì)算軟件已應(yīng)用于國(guó)內(nèi)主要超級(jí)計(jì)算機(jī)系統(tǒng)。多次擔(dān)任“國(guó)產(chǎn)CPU并行應(yīng)用挑戰(zhàn)賽”等軟件優(yōu)化比賽評(píng)委。
湯德佑
華南理工大學(xué)軟件學(xué)院副教授,長(zhǎng)期致力于提升數(shù)據(jù)庫(kù)引擎和生物信息學(xué)軟件性能。深入優(yōu)化ARM和Intel平臺(tái)上數(shù)據(jù)庫(kù)基礎(chǔ)算子性能,并提交至開源社區(qū);針對(duì)Intel高性能計(jì)算平臺(tái)開發(fā)基因組數(shù)據(jù)分析軟件、HBV病毒整合位點(diǎn)分析等專業(yè)生物信息學(xué)軟件。
黃 敏
華南理工大學(xué)軟件學(xué)院副院長(zhǎng)、副教授,主要研究軟件體系結(jié)構(gòu)和軟件性能優(yōu)化技術(shù)。近年來(lái)承擔(dān)和參與國(guó)家自然科學(xué)基金、廣東省科技攻關(guān)、廣東省自然科學(xué)基金、產(chǎn)學(xué)合作協(xié)同育人、廣東省高等教育改革等多項(xiàng)國(guó)家和省部級(jí)課題。發(fā)表SCI/EI收錄的高水平研究論文60余篇,并擔(dān)任多個(gè)國(guó)際期刊的編輯和審稿人。
前言
第 1 章 引言 1
1.1 軟件優(yōu)化概述 1
1.1.1 軟件優(yōu)化的主要方法 1
1.1.2 軟件性能工程 3
1.1.3 關(guān)于軟件優(yōu)化的一些觀點(diǎn) 4
1.2 評(píng)價(jià)軟件性能的指標(biāo)和方法 6
1.2.1 延遲和吞吐率 6
1.2.2 加速比和效率 7
1.2.3 Amdahl 定理 8
1.2.4 M/M/k 模型 9
1.3 常用軟件工具和時(shí)間測(cè)量方法 10
1.3.1 常用軟件工具 10
1.3.2 時(shí)間測(cè)量 13
1.4 一個(gè)程序性能分析的實(shí)例 15
1.5 擴(kuò)展閱讀 16
1.6 習(xí)題 17
1.7 實(shí)驗(yàn)題 18
參考文獻(xiàn) 20
第 2 章 CPU 上的基本優(yōu)化方法 21
2.1 計(jì)算機(jī)體系結(jié)構(gòu)基礎(chǔ) 21
2.1.1 指令集體系結(jié)構(gòu) 21
2.1.2 指令鐵律 24
2.1.3 流水線及其相關(guān)性 26
2.1.4 超標(biāo)量和亂序執(zhí)行 27
2.1.5 典型微處理器的微結(jié)構(gòu) 29
2.2 針對(duì)算術(shù)邏輯指令的優(yōu)化 31
2.2.1 現(xiàn)代微處理器的算術(shù)邏輯指令延遲與吞吐率 31
2.2.2 選擇合適的數(shù)據(jù)類型 32
2.2.3 使用簡(jiǎn)單指令代替復(fù)雜指令 33
2.2.4 使用特殊指令 34
2.2.5 查表法 35
2.3 針對(duì)條件分支指令的優(yōu)化 36
2.3.1 分支預(yù)測(cè) 36
2.3.2 消除分支 38
2.3.3 組合多個(gè)分支以提高分支預(yù)測(cè)的準(zhǔn)確度 38
2.3.4 使用條件執(zhí)行指令 39
2.3.5 合理使用 switch 語(yǔ)句40
2.4 針對(duì) Cache 的優(yōu)化 41
2.4.1 現(xiàn)代微處理器的Cache 41
2.4.2 數(shù)據(jù)對(duì)齊 43
2.4.3 SoA 的結(jié)構(gòu)組織方式 44
2.4.4 數(shù)據(jù)分塊以提升 Cache命中率 45
2.4.5 Cache 預(yù)取 46
2.5 針對(duì)循環(huán)結(jié)構(gòu)的優(yōu)化 47
2.5.1 消除循環(huán) 47
2.5.2 循環(huán)展開 47
2.6 綜合實(shí)例 49
2.6.1 Linux 內(nèi)核中的 ECC 計(jì)算 49
2.6.2 Hash 表的構(gòu)建 53
2.7 擴(kuò)展閱讀 55
2.8 習(xí)題 56
2.9 實(shí)驗(yàn)題 57
參考文獻(xiàn) 59
第 3 章 基于 SIMD 指令系統(tǒng)的優(yōu)化方法 61
3.1 SIMD 指令系統(tǒng)簡(jiǎn)介 61
3.1.1 SIMD 指令系統(tǒng)概況 61
3.1.2 軟件系統(tǒng)使用 SIMD 指令的方法 63
3.2 SIMD 內(nèi)嵌原語(yǔ) 64
3.2.1 內(nèi)嵌原語(yǔ)的數(shù)據(jù)類型 64
3.2.2 向量設(shè)置操作 65
3.2.3 計(jì)算操作 66
3.2.4 比較操作 68
3.2.5 訪存操作 69
3.2.6 數(shù)據(jù)排列操作 71
3.3 基于內(nèi)嵌原語(yǔ)的 SIMD 程序設(shè)計(jì) 72
3.3.1 數(shù)據(jù)對(duì)齊和數(shù)據(jù)寬度 73
3.3.2 SoA 結(jié)構(gòu) 74
3.3.3 數(shù)據(jù)比較 76
3.3.4 特殊指令 77
3.3.5 寄存器數(shù)量 79
3.4 SIMD 程序?qū)嵗 ?1
3.4.1 使用 SSE 指令去除空格 81
3.4.2 基于 SIMD 指令的雙調(diào)排序和歸并排序 82
3.4.3 fftw 的可移植設(shè)計(jì) 84
3.5 擴(kuò)展閱讀 88
3.6 習(xí)題 88
3.7 實(shí)驗(yàn)題 88
參考文獻(xiàn) 90
第 4 章 基于多線程的優(yōu)化方法 94
4.1 多核處理器體系結(jié)構(gòu) 94
4.1.1 多線程處理器 94
4.1.2 多核處理器系統(tǒng) 96
4.1.3 Cache 一致性協(xié)議 98
4.2 操作系統(tǒng)級(jí)線程調(diào)用 100
4.2.1 線程 100
4.2.2 線程基本 API 102
4.2.3 Linux 的線程同步和互斥 105
4.2.4 Windows 的線程同步和互斥 110
4.3 OpenMP 113
4.3.1 for 編譯制導(dǎo)語(yǔ)句 114
4.3.2 共享變量和私有變量 115
4.3.3 歸約子句 116
4.3.4 nowait 子句 117
4.3.5 single 制導(dǎo)指令 118
4.3.6 critical 子句 119
4.3.7 barrier 子句 119
4.3.8 其他子句 120
4.4 多線程程序的一些問(wèn)題 120
4.4.1 臨界區(qū) 120
4.4.2 Cache 偽共享 123
4.4.3 多線程的并行化設(shè)計(jì)方法 124
4.5 多線程并行化實(shí)例 125
4.5.1 Horner算法的并行化 125
4.5.2 構(gòu)建 Hash 表 126
4.5.3 歸并排序 127
4.6 擴(kuò)展閱讀 129
4.7 習(xí)題 130
4.8 實(shí)驗(yàn)題 131
參考文獻(xiàn) 133
第 5 章 GPU 的優(yōu)化方法 135
5.1 GPU 體系結(jié)構(gòu) 135
5.1.1 面向吞吐率優(yōu)化的異構(gòu)
計(jì)算 135
5.1.2 GPU 總體結(jié)構(gòu) 136
5.1.3 SIMT 機(jī)制 136
5.1.4 存儲(chǔ)器結(jié)構(gòu) 139
5.2 GPU 基本編程方法 139
5.2.1 線程的組織結(jié)構(gòu) 139
5.2.2 GPU 函數(shù)說(shuō)明 140
5.2.3 存儲(chǔ)器管理以及與主機(jī)的數(shù)據(jù)交換 141
5.2.4 GPU 上線程之間的同步 143
5.2.5 OpenCL 的程序?qū)ο蠛蛢?nèi)核對(duì)象 144
5.2.6 程序?qū)嵗 ?45
5.3 GPU 程序優(yōu)化方法 148
5.3.1 指令吞吐率 148
5.3.2 資源利用率 149
5.3.3 共享存儲(chǔ)器 150
5.3.4 全局存儲(chǔ)器 152
5.3.5 掩蓋主機(jī)和 GPU 之間的數(shù)據(jù)傳輸延遲 152
5.3.6 動(dòng)態(tài)并行機(jī)制 154
5.4 GPU 程序?qū)嵗 ?55
5.4.1 矩陣乘法 155
5.4.2 LU 分解 157
5.5 擴(kuò)展閱讀 159
5.6 習(xí)題 159
5.7 實(shí)驗(yàn)題 160
參考文獻(xiàn) 160
第 6 章 面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的優(yōu)化方法 162
6.1 C++ 的性能優(yōu)化 162
6.1.1 C++ 實(shí)現(xiàn)簡(jiǎn)介 162
6.1.2 STL 167
6.2 Java 的性能優(yōu)化 168
6.2.1 Java 虛擬機(jī)簡(jiǎn)介 168
6.2.2 Java 字節(jié)碼的執(zhí)行機(jī)制 170
6.2.3 Java 本地接口 172
6.2.4 Java 的多線程機(jī)制 174
6.3 垃圾回收 176
6.3.1 垃圾回收基本技術(shù) 176
6.3.2 HotSpot JVM 中的垃圾回收 181
6.4 擴(kuò)展閱讀 183
6.5 習(xí)題 184
6.6 實(shí)驗(yàn)題 184
參考文獻(xiàn) 186
第 7 章 系統(tǒng)級(jí)軟件優(yōu)化 188
7.1 硬盤系統(tǒng)與文件系統(tǒng)的性能優(yōu)
化 189
7.1.1 硬盤系統(tǒng) 189
7.1.2 文件系統(tǒng) 191
7.1.3 性能優(yōu)化方法 193
7.1.4 實(shí)例:外排序 194
7.2 網(wǎng)絡(luò)連接的性能優(yōu)化 196
7.2.1 網(wǎng)絡(luò)連接硬件 196
7.2.2 網(wǎng)絡(luò)編程簡(jiǎn)介 197
7.2.3 性能優(yōu)化方法 200
7.2.4 實(shí)例:Web 服務(wù)器的結(jié)構(gòu) 204
7.3 軟件總體結(jié)構(gòu)的設(shè)計(jì)考慮 207
7.3.1 用戶友好性設(shè)計(jì) 207
7.3.2 可移植性設(shè)計(jì) 208
7.3.3 錯(cuò)誤處理設(shè)計(jì) 209
7.3.4 系統(tǒng)可維護(hù)性設(shè)計(jì) 210
7.4 擴(kuò)展閱讀 211
7.5 習(xí)題 212
7.6 實(shí)驗(yàn)題 212
參考文獻(xiàn) 213