計算機系統(tǒng)開發(fā)與優(yōu)化實戰(zhàn)
定 價:109.8 元
- 作者:周文嘉 劉 盼 王鈺達(dá) 等
- 出版時間:2022/8/1
- ISBN:9787115592880
- 出 版 社:人民郵電出版社
- 中圖法分類:TP303
- 頁碼:358
- 紙張:
- 版次:01
- 開本:16開
本書首先介紹通用處理器的架構(gòu),以及匯編和編譯的技術(shù);然后講解 Linux 內(nèi)存管理、Linux 進(jìn)程管理, 以及 GDB、trace、eBPF、SystemTap 等 Linux 系統(tǒng)開發(fā)工具;接著通過視頻編解碼主流技術(shù)和 NVIDIA 計算平臺 CUDA 等討論人工智能技術(shù)在音視頻領(lǐng)域與自然語言處理領(lǐng)域的應(yīng)用;最后講解標(biāo)準(zhǔn)計算平臺 OpenCL 的原理、開源硬件 soDLA、Intel 神經(jīng)網(wǎng)絡(luò)異構(gòu)加速芯片、SystemC 框架。
本書適合從事企業(yè)系統(tǒng)開發(fā)及優(yōu)化的技術(shù)人員閱讀,也可供計算機相關(guān)專業(yè)的師生參考。
*匯聚大量芯片開發(fā)人員的經(jīng)驗總結(jié);
*涵蓋處理器芯片架構(gòu)、核心系統(tǒng)軟件的設(shè)計與開發(fā);
*兼顧計算機系統(tǒng)硬件和軟件開發(fā)。
本書知識結(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ǔ)軟件開源項目;
硬件架構(gòu)。
周文嘉,目前就職于某國產(chǎn) AI GPU 芯片公司,曾服務(wù)于 ARM、阿里巴巴、HTC 等公司,擁有 10 年以上工作經(jīng)驗,主要從事系統(tǒng)軟件開發(fā),涵蓋系統(tǒng)庫開發(fā)、指令集優(yōu)化、Linux 內(nèi)核開發(fā)等,為某些開源社貢獻(xiàn)過一定數(shù)量的補丁,擔(dān)任 Free time team 創(chuàng)始人,致力于免費教育事業(yè)。
劉盼,目前就職于某國際芯片公司,曾服務(wù)于三星電子研究所、某自動駕駛科技公司,具有手機、汽車和芯片行業(yè)的工作經(jīng)驗,創(chuàng)辦 4 萬多人的極客社區(qū)—“人人都是極客”,擔(dān)任某科技公司合伙人,是谷歌開發(fā)者社區(qū)優(yōu)秀講師。
王鈺達(dá),加州大學(xué)伯克利分校和伊利諾伊理工學(xué)院雙碩士,目前專注于 RISC-V 工具鏈、NVDLA 工具鏈、自定義自動駕駛相關(guān)加速器芯片前端和后端設(shè)計的敏捷開發(fā)。
目 錄
第 1章 通用處理器架構(gòu)簡介 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異常級別 8
1.5 內(nèi)存模式 9
1.5.1 內(nèi)存對齊 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)安全增強 12
1.8.1 屏障指令 12
1.8.2 PAN 13
1.8.3 MTE 14
1.9 虛擬化 14
1.9.1 ARMv7a虛擬化擴展 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 運行時問題的深入討論 16
1.10.3 處理器架構(gòu)檢測 18
1.10.4 ARMv8架構(gòu)主要特性 20
1.11 主流編譯器和模擬器對ARMv8 架構(gòu)的支持 21
1.11.1 GCC對ARMv8架構(gòu)的支持 21
1.11.2 QEMU模擬器對ARMv8架構(gòu)的支持 22
第 2章 匯編與編譯技術(shù)入門 23
2.1 通過C/C++學(xué)習(xí)匯編語言 23
2.1.1 位運算通用優(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 實際案例 38
2.3 RISC-V匯編介紹 38
2.3.1 RISC-V匯編指令說明 40
2.3.2 RISC-V啟動代碼的分析 41
2.4 玩具編譯器mini_c的實現(xiàn) 45
2.4.1 詞法分析 45
2.4.2 語法分析 46
2.4.3 mini_c的源代碼 48
2.5 LLVM簡介 49
2.5.1 LLVM的代碼表示 49
2.5.2 LLVM優(yōu)化 50
2.6 LLVM實驗代碼 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ū)頁幀分配器 67
3.3.1 伙伴算法 77
3.3.2 水位控制 84
3.3.3 內(nèi)存回收 88
3.3.4 碎片頁面規(guī)整 91
3.4 slab分配器及kmalloc的實現(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的實現(xiàn) 101
3.5 vmalloc()的原理和實現(xiàn) 103
3.5.1 數(shù)據(jù)結(jié)構(gòu) 103
3.5.2 vmalloc()的實現(xiàn) 105
3.6 malloc()/mmap()的原理和實現(xiàn) 107
3.6.1 認(rèn)識VMA 107
3.6.2 malloc()的實現(xiàn) 112
3.6.3 認(rèn)識mm->brk 112
3.6.4 mmap()的實現(xiàn) 114
3.7 缺頁異常處理 115
3.7.1 匿名頁面缺頁中斷 120
3.7.2 文件映射缺頁中斷 122
3.7.3 頁被交換到交換分區(qū) 123
3.7.4 寫時復(fù)制 125
第4章 Linux進(jìn)程管理 128
4.1 Linux對進(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ù)的實現(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)度時刻 150
4.4.4 調(diào)度算法 154
4.4.5 CFS 156
4.4.6 選擇下一個進(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 何時做負(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 代碼斷點 177
5.1.3 數(shù)據(jù)斷點 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的兩個例子 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計算平臺CUDA 255
6.2.1 CUDA:并行化的編程模型 255
6.2.2 線程層次結(jié)構(gòu) 256
6.2.3 CUDA的線程索引計算 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計算與OpenCL
介紹 273
7.1.1 什么是OpenCL 273
7.1.2 OpenCL類圖 275
7.2 OpenCL架構(gòu) 276
7.2.1 平臺模型 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 平臺、上下文、設(shè)備 295
7.4.1 OpenCL平臺 295
7.4.2 設(shè)備 296
7.4.3 OpenCL上下文 298
7.5 程序?qū)ο蠛蛢?nèi)核對象 300
7.5.1 程序?qū)ο?301
7.5.2 內(nèi)核對象 303
7.6 緩沖區(qū) 305
7.6.1 創(chuàng)建內(nèi)存對象 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章 一些開源項目 323
8.1 ISA-L開源項目優(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實踐 326
8.2.2 基于虛擬機的OOPS-RTOS實踐 331
8.3 基于Linux內(nèi)核的BiscuitOS實踐 332
8.3.1 構(gòu)建基于ARM64 Linux的 BiscuitOS 332
8.3.2 基于BiscuitOS的內(nèi)核源代碼實踐 333
8.3.3 基于BiscuitOS的內(nèi)核模塊開發(fā) 335
8.3.4 基于BiscuitOS的應(yīng)用程序開發(fā) 337
8.3.5 BiscuitOS高級實踐 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 推理計算引擎ICE 346
9.3.3 DL計算網(wǎng)絡(luò) 347
9.3.4 矢量處理器 348
9.3.5 內(nèi)存架構(gòu) 349
9.3.6 負(fù)載靈活及可擴展性 349
9.3.7 神經(jīng)網(wǎng)絡(luò)推理計算優(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 一個簡單的SystemC例子 354