計(jì)算機(jī)系統(tǒng)開發(fā)與優(yōu)化實(shí)戰(zhàn)
本書首先介紹通用處理器的架構(gòu),以及匯編和編譯的技術(shù);然后講解 Linux 內(nèi)存管理、Linux 進(jìn)程管理, 以及 GDB、trace、eBPF、SystemTap 等 Linux 系統(tǒng)開發(fā)工具;接著通過視頻編解碼主流技術(shù)和 NVIDIA 計(jì)算平臺(tái) CUDA 等討論人工智能技術(shù)在音視頻領(lǐng)域與自然語言處理領(lǐng)域的應(yīng)用;最后講解標(biāo)準(zhǔn)計(jì)算平臺(tái) OpenCL 的原理、開源硬件 soDLA、Intel 神經(jīng)網(wǎng)絡(luò)異構(gòu)加速芯片、SystemC 框架。
本書適合從事企業(yè)系統(tǒng)開發(fā)及優(yōu)化的技術(shù)人員閱讀,也可供計(jì)算機(jī)相關(guān)專業(yè)的師生參考。
*匯聚大量芯片開發(fā)人員的經(jīng)驗(yàn)總結(jié);
*涵蓋處理器芯片架構(gòu)、核心系統(tǒng)軟件的設(shè)計(jì)與開發(fā);
*兼顧計(jì)算機(jī)系統(tǒng)硬件和軟件開發(fā)。
本書知識(shí)結(jié)構(gòu):
通用處理器的架構(gòu);
匯編和編譯技術(shù);
Linux 內(nèi)核中的內(nèi)存管理;
Linux 內(nèi)核中的進(jìn)程管理;
Linux 系統(tǒng)中的一些開發(fā)和調(diào)試工具;
人工智能技術(shù)和 OpenCL 編程技術(shù);
一些基礎(chǔ)軟件開源項(xiàng)目;
硬件架構(gòu)。
周文嘉,目前就職于某國(guó)產(chǎn) AI GPU 芯片公司,曾服務(wù)于 ARM、阿里巴巴、HTC 等公司,擁有 10 年以上工作經(jīng)驗(yàn),主要從事系統(tǒng)軟件開發(fā),涵蓋系統(tǒng)庫(kù)開發(fā)、指令集優(yōu)化、Linux 內(nèi)核開發(fā)等,為某些開源社貢獻(xiàn)過一定數(shù)量的補(bǔ)丁,擔(dān)任 Free time team 創(chuàng)始人,致力于免費(fèi)教育事業(yè)。
劉盼,目前就職于某國(guó)際芯片公司,曾服務(wù)于三星電子研究所、某自動(dòng)駕駛科技公司,具有手機(jī)、汽車和芯片行業(yè)的工作經(jīng)驗(yàn),創(chuàng)辦 4 萬多人的極客社區(qū)—“人人都是極客”,擔(dān)任某科技公司合伙人,是谷歌開發(fā)者社區(qū)優(yōu)秀講師。
王鈺達(dá),加州大學(xué)伯克利分校和伊利諾伊理工學(xué)院雙碩士,目前專注于 RISC-V 工具鏈、NVDLA 工具鏈、自定義自動(dòng)駕駛相關(guān)加速器芯片前端和后端設(shè)計(jì)的敏捷開發(fā)。
目 錄
第 1章 通用處理器架構(gòu)簡(jiǎn)介 1
1.1 綜述 1
1.2 AArch64寄存器堆 2
1.2.1 通用寄存器 2
1.2.2 特殊寄存器 2
1.2.3 系統(tǒng)控制寄存器 2
1.2.4 處理器狀態(tài) 3
1.2.5 函數(shù)調(diào)用標(biāo)準(zhǔn) 4
1.3 流水線 5
1.3.1 Cortex-A77微架構(gòu) 5
1.3.2 微架構(gòu)與代碼優(yōu)化 7
1.4 AArch64異常級(jí)別 8
1.5 內(nèi)存模式 9
1.5.1 內(nèi)存對(duì)齊 9
1.5.2 檢查內(nèi)存模式問題的工具 9
1.6 原子操作 10
1.6.1 指令介紹 10
1.6.2 原子指令使用示例 11
1.7 處理器緩存 12
1.8 系統(tǒng)安全增強(qiáng) 12
1.8.1 屏障指令 12
1.8.2 PAN 13
1.8.3 MTE 14
1.9 虛擬化 14
1.9.1 ARMv7a虛擬化擴(kuò)展 14
1.9.2 ARM KVM work 15
1.9.3 ARM VHE 15
1.9.4 虛擬化的其他特性 15
1.10 更多處理器架構(gòu)特性 16
1.10.1 獲取處理器特性 16
1.10.2 運(yùn)行時(shí)問題的深入討論 16
1.10.3 處理器架構(gòu)檢測(cè) 18
1.10.4 ARMv8架構(gòu)主要特性 20
1.11 主流編譯器和模擬器對(duì)ARMv8 架構(gòu)的支持 21
1.11.1 GCC對(duì)ARMv8架構(gòu)的支持 21
1.11.2 QEMU模擬器對(duì)ARMv8架構(gòu)的支持 22
第 2章 匯編與編譯技術(shù)入門 23
2.1 通過C/C++學(xué)習(xí)匯編語言 23
2.1.1 位運(yùn)算通用優(yōu)化技巧 23
2.1.2 利用ARM的ubfiz等指令優(yōu)化位操作 23
2.1.3 指令與數(shù)據(jù)保序 24
2.2 ARM64 NEON技術(shù) 24
2.2.1 NEON寄存器 25
2.2.2 調(diào)試環(huán)境 27
2.2.3 NEON編程 28
2.2.4 不同NEON開發(fā)方式的比較 37
2.2.5 SIMD優(yōu)化技巧 38
2.2.6 實(shí)際案例 38
2.3 RISC-V匯編介紹 38
2.3.1 RISC-V匯編指令說明 40
2.3.2 RISC-V啟動(dòng)代碼的分析 41
2.4 玩具編譯器mini_c的實(shí)現(xiàn) 45
2.4.1 詞法分析 45
2.4.2 語法分析 46
2.4.3 mini_c的源代碼 48
2.5 LLVM簡(jiǎn)介 49
2.5.1 LLVM的代碼表示 49
2.5.2 LLVM優(yōu)化 50
2.6 LLVM實(shí)驗(yàn)代碼 51
2.7 LLVM源代碼 52
2.7.1 LLVM-6.0源代碼編譯 52
2.7.2 LLVM-12.0源代碼編譯 53
第3章 Linux內(nèi)存管理 54
3.1 從CPU角度看內(nèi)存 54
3.2 內(nèi)核初始化內(nèi)存 58
3.2.1 early_fixmap_init()函數(shù) 58
3.2.2 setup_machine_fdt()函數(shù) 59
3.2.3 arm64_memblock_init()函數(shù) 60
3.2.4 paging_init()函數(shù) 61
3.2.5 bootmem_init()函數(shù) 63
3.3 分區(qū)頁(yè)幀分配器 67
3.3.1 伙伴算法 77
3.3.2 水位控制 84
3.3.3 內(nèi)存回收 88
3.3.4 碎片頁(yè)面規(guī)整 91
3.4 slab分配器及kmalloc的實(shí)現(xiàn) 96
3.4.1 走進(jìn)slab分配器 96
3.4.2 數(shù)據(jù)結(jié)構(gòu) 98
3.4.3 流程分析 100
3.4.4 kmalloc的實(shí)現(xiàn) 101
3.5 vmalloc()的原理和實(shí)現(xiàn) 103
3.5.1 數(shù)據(jù)結(jié)構(gòu) 103
3.5.2 vmalloc()的實(shí)現(xiàn) 105
3.6 malloc()/mmap()的原理和實(shí)現(xiàn) 107
3.6.1 認(rèn)識(shí)VMA 107
3.6.2 malloc()的實(shí)現(xiàn) 112
3.6.3 認(rèn)識(shí)mm->brk 112
3.6.4 mmap()的實(shí)現(xiàn) 114
3.7 缺頁(yè)異常處理 115
3.7.1 匿名頁(yè)面缺頁(yè)中斷 120
3.7.2 文件映射缺頁(yè)中斷 122
3.7.3 頁(yè)被交換到交換分區(qū) 123
3.7.4 寫時(shí)復(fù)制 125
第4章 Linux進(jìn)程管理 128
4.1 Linux對(duì)進(jìn)程的描述 128
4.1.1 通過task_struct描述進(jìn)程 128
4.1.2 task_struct、thread_info和內(nèi)核棧的關(guān)系 129
4.1.3 如何獲取當(dāng)前進(jìn)程 131
4.2 用戶態(tài)進(jìn)程/線程的創(chuàng)建 131
4.2.1 fork()函數(shù) 132
4.2.2 vfork()函數(shù) 134
4.2.3 pthread_create()函數(shù) 135
4.2.4 fork()函數(shù)、vfork()函數(shù)和pthread_create()函數(shù)的關(guān)系 136
4.3 do_fork()函數(shù)的實(shí)現(xiàn) 137
4.3.1 copy_process()函數(shù) 138
4.3.2 wake_up_new_task()函數(shù) 144
4.4 進(jìn)程調(diào)度 146
4.4.1 進(jìn)程的分類 146
4.4.2 與調(diào)度相關(guān)的數(shù)據(jù)結(jié)構(gòu) 147
4.4.3 調(diào)度時(shí)刻 150
4.4.4 調(diào)度算法 154
4.4.5 CFS 156
4.4.6 選擇下一個(gè)進(jìn)程 158
4.4.7 進(jìn)程上下文切換 162
4.5 多核系統(tǒng)的負(fù)載均衡 164
4.5.1 多核架構(gòu) 164
4.5.2 CPU拓?fù)?165
4.5.3 調(diào)度域和調(diào)度組 169
4.5.4 CPU拓?fù)渲姓{(diào)度域的初始化 172
4.5.5 何時(shí)做負(fù)載均衡 173
4.5.6 負(fù)載均衡的基本過程 174
第5章 Linux系統(tǒng)開發(fā)工具 177
5.1 GDB調(diào)試工具 177
5.1.1 程序調(diào)試方法 177
5.1.2 代碼斷點(diǎn) 177
5.1.3 數(shù)據(jù)斷點(diǎn) 182
5.1.4 多線程調(diào)試 184
5.1.5 捕獲當(dāng)前位置 187
5.1.6 GDB的原理 191
5.1.7 coredump文件的使用 191
5.1.8 通過網(wǎng)絡(luò)進(jìn)行GDB遠(yuǎn)程調(diào)試 197
5.2 trace工具 198
5.2.1 ltrace 198
5.2.2 strace 200
5.2.3 ftrace 202
5.2.4 kprobe 206
5.3 eBPF 209
5.3.1 prog注入流程 209
5.3.2 eBPF寄存器 210
5.3.3 eBPF prog的加載流程 210
5.4 SystemTap 241
5.4.1 底層軟件工程師的困境 241
5.4.2 SystemTap的出現(xiàn)和發(fā)展歷史 241
5.4.3 關(guān)于SystemTap的兩個(gè)例子 242
5.4.4 基本原理 243
5.4.5 深入了解原理 247
第6章 人工智能技術(shù) 250
6.1 視頻編解碼主流技術(shù)及軟件框架 250
6.1.1 FFmpeg/VAAPI框架介紹 250
6.1.2 Gstreamer框架介紹 251
6.1.3 OpenCV框架介紹 253
6.2 NVIDIA計(jì)算平臺(tái)CUDA 255
6.2.1 CUDA:并行化的編程模型 255
6.2.2 線程層次結(jié)構(gòu) 256
6.2.3 CUDA的線程索引計(jì)算 257
6.2.4 CUDA的內(nèi)存模型 258
6.2.5 CUDA用例 259
6.3 基礎(chǔ)技術(shù)介紹 261
6.3.1 GEMM算法 261
6.3.2 Resnet 263
6.3.3 KCF算法 265
6.3.4 PyTorch&LibTorch深度學(xué)習(xí)框架 270
第7章 OpenCL的編程技術(shù) 273
7.1 GPU計(jì)算與OpenCL
介紹 273
7.1.1 什么是OpenCL 273
7.1.2 OpenCL類圖 275
7.2 OpenCL架構(gòu) 276
7.2.1 平臺(tái)模型 277
7.2.2 執(zhí)行模型 277
7.2.3 內(nèi)存模型 282
7.2.4 編程模型 283
7.2.5 OpenCL總結(jié) 284
7.3 關(guān)于OpenCL的例子 285
7.4 平臺(tái)、上下文、設(shè)備 295
7.4.1 OpenCL平臺(tái) 295
7.4.2 設(shè)備 296
7.4.3 OpenCL上下文 298
7.5 程序?qū)ο蠛蛢?nèi)核對(duì)象 300
7.5.1 程序?qū)ο?301
7.5.2 內(nèi)核對(duì)象 303
7.6 緩沖區(qū) 305
7.6.1 創(chuàng)建內(nèi)存對(duì)象 305
7.6.2 查詢緩沖區(qū)信息 306
7.6.3 讀、寫和復(fù)制緩沖區(qū) 306
7.6.4 映射緩沖區(qū) 314
7.7 關(guān)于OpenCL的案例研究 315
7.7.1 圖像顏色模型轉(zhuǎn)換 315
7.7.2 圖像縮放 317
7.7.3 高斯模糊 320
第8章 一些開源項(xiàng)目 323
8.1 ISA-L開源項(xiàng)目?jī)?yōu)化技巧 323
8.1.1 memory 324
8.1.2 crc 324
8.1.3 igzip 325
8.1.4 isa-l_crypto 326
8.2 OOPS-RTOS 326
8.2.1 基于硬件板的OOPS-RTOS實(shí)踐 326
8.2.2 基于虛擬機(jī)的OOPS-RTOS實(shí)踐 331
8.3 基于Linux內(nèi)核的BiscuitOS實(shí)踐 332
8.3.1 構(gòu)建基于ARM64 Linux的 BiscuitOS 332
8.3.2 基于BiscuitOS的內(nèi)核源代碼實(shí)踐 333
8.3.3 基于BiscuitOS的內(nèi)核模塊開發(fā) 335
8.3.4 基于BiscuitOS的應(yīng)用程序開發(fā) 337
8.3.5 BiscuitOS高級(jí)實(shí)踐 338
第9章 硬件架構(gòu) 339
9.1 概述 339
9.2 開源硬件soDLA 339
9.2.1 FIFO模塊 341
9.2.2 RDMA和WDMA模塊 341
9.2.3 Retiming模塊和pipe模塊 342
9.2.4 CSC和CMAC模塊 342
9.2.5 DMA類型的選擇 344
9.3 Intel神經(jīng)網(wǎng)絡(luò)異構(gòu)加速芯片 344
9.3.1 Spring Hill硬件架構(gòu) 345
9.3.2 推理計(jì)算引擎ICE 346
9.3.3 DL計(jì)算網(wǎng)絡(luò) 347
9.3.4 矢量處理器 348
9.3.5 內(nèi)存架構(gòu) 349
9.3.6 負(fù)載靈活及可擴(kuò)展性 349
9.3.7 神經(jīng)網(wǎng)絡(luò)推理計(jì)算優(yōu)化 349
9.3.8 通用神經(jīng)網(wǎng)絡(luò)優(yōu)化 350
9.3.9 與硬件相關(guān)的神經(jīng)網(wǎng)絡(luò)優(yōu)化 351
9.4 SystemC框架 351
9.4.1 SystemC的用途 352
9.4.2 SystemC環(huán)境搭建 353
9.4.3 一個(gè)簡(jiǎn)單的SystemC例子 354