計算機系統(tǒng)開發(fā)與優(yōu)化實戰(zhàn)
定 價:109.8 元
- 作者:周文嘉 劉 盼 王鈺達 等
- 出版時間:2022/8/1
- ISBN:9787115592880
- 出 版 社:人民郵電出版社
- 中圖法分類:TP303
- 頁碼:358
- 紙張:
- 版次:01
- 開本:16開
本書首先介紹通用處理器的架構,以及匯編和編譯的技術;然后講解 Linux 內存管理、Linux 進程管理, 以及 GDB、trace、eBPF、SystemTap 等 Linux 系統(tǒng)開發(fā)工具;接著通過視頻編解碼主流技術和 NVIDIA 計算平臺 CUDA 等討論人工智能技術在音視頻領域與自然語言處理領域的應用;最后講解標準計算平臺 OpenCL 的原理、開源硬件 soDLA、Intel 神經網絡異構加速芯片、SystemC 框架。
本書適合從事企業(yè)系統(tǒng)開發(fā)及優(yōu)化的技術人員閱讀,也可供計算機相關專業(yè)的師生參考。
*匯聚大量芯片開發(fā)人員的經驗總結;
*涵蓋處理器芯片架構、核心系統(tǒng)軟件的設計與開發(fā);
*兼顧計算機系統(tǒng)硬件和軟件開發(fā)。
本書知識結構:
通用處理器的架構;
匯編和編譯技術;
Linux 內核中的內存管理;
Linux 內核中的進程管理;
Linux 系統(tǒng)中的一些開發(fā)和調試工具;
人工智能技術和 OpenCL 編程技術;
一些基礎軟件開源項目;
硬件架構。
周文嘉,目前就職于某國產 AI GPU 芯片公司,曾服務于 ARM、阿里巴巴、HTC 等公司,擁有 10 年以上工作經驗,主要從事系統(tǒng)軟件開發(fā),涵蓋系統(tǒng)庫開發(fā)、指令集優(yōu)化、Linux 內核開發(fā)等,為某些開源社貢獻過一定數量的補丁,擔任 Free time team 創(chuàng)始人,致力于免費教育事業(yè)。
劉盼,目前就職于某國際芯片公司,曾服務于三星電子研究所、某自動駕駛科技公司,具有手機、汽車和芯片行業(yè)的工作經驗,創(chuàng)辦 4 萬多人的極客社區(qū)—“人人都是極客”,擔任某科技公司合伙人,是谷歌開發(fā)者社區(qū)優(yōu)秀講師。
王鈺達,加州大學伯克利分校和伊利諾伊理工學院雙碩士,目前專注于 RISC-V 工具鏈、NVDLA 工具鏈、自定義自動駕駛相關加速器芯片前端和后端設計的敏捷開發(fā)。
目 錄
第 1章 通用處理器架構簡介 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 函數調用標準 4
1.3 流水線 5
1.3.1 Cortex-A77微架構 5
1.3.2 微架構與代碼優(yōu)化 7
1.4 AArch64異常級別 8
1.5 內存模式 9
1.5.1 內存對齊 9
1.5.2 檢查內存模式問題的工具 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 更多處理器架構特性 16
1.10.1 獲取處理器特性 16
1.10.2 運行時問題的深入討論 16
1.10.3 處理器架構檢測 18
1.10.4 ARMv8架構主要特性 20
1.11 主流編譯器和模擬器對ARMv8 架構的支持 21
1.11.1 GCC對ARMv8架構的支持 21
1.11.2 QEMU模擬器對ARMv8架構的支持 22
第 2章 匯編與編譯技術入門 23
2.1 通過C/C++學習匯編語言 23
2.1.1 位運算通用優(yōu)化技巧 23
2.1.2 利用ARM的ubfiz等指令優(yōu)化位操作 23
2.1.3 指令與數據保序 24
2.2 ARM64 NEON技術 24
2.2.1 NEON寄存器 25
2.2.2 調試環(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內存管理 54
3.1 從CPU角度看內存 54
3.2 內核初始化內存 58
3.2.1 early_fixmap_init()函數 58
3.2.2 setup_machine_fdt()函數 59
3.2.3 arm64_memblock_init()函數 60
3.2.4 paging_init()函數 61
3.2.5 bootmem_init()函數 63
3.3 分區(qū)頁幀分配器 67
3.3.1 伙伴算法 77
3.3.2 水位控制 84
3.3.3 內存回收 88
3.3.4 碎片頁面規(guī)整 91
3.4 slab分配器及kmalloc的實現(xiàn) 96
3.4.1 走進slab分配器 96
3.4.2 數據結構 98
3.4.3 流程分析 100
3.4.4 kmalloc的實現(xiàn) 101
3.5 vmalloc()的原理和實現(xiàn) 103
3.5.1 數據結構 103
3.5.2 vmalloc()的實現(xiàn) 105
3.6 malloc()/mmap()的原理和實現(xiàn) 107
3.6.1 認識VMA 107
3.6.2 malloc()的實現(xiàn) 112
3.6.3 認識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 寫時復制 125
第4章 Linux進程管理 128
4.1 Linux對進程的描述 128
4.1.1 通過task_struct描述進程 128
4.1.2 task_struct、thread_info和內核棧的關系 129
4.1.3 如何獲取當前進程 131
4.2 用戶態(tài)進程/線程的創(chuàng)建 131
4.2.1 fork()函數 132
4.2.2 vfork()函數 134
4.2.3 pthread_create()函數 135
4.2.4 fork()函數、vfork()函數和pthread_create()函數的關系 136
4.3 do_fork()函數的實現(xiàn) 137
4.3.1 copy_process()函數 138
4.3.2 wake_up_new_task()函數 144
4.4 進程調度 146
4.4.1 進程的分類 146
4.4.2 與調度相關的數據結構 147
4.4.3 調度時刻 150
4.4.4 調度算法 154
4.4.5 CFS 156
4.4.6 選擇下一個進程 158
4.4.7 進程上下文切換 162
4.5 多核系統(tǒng)的負載均衡 164
4.5.1 多核架構 164
4.5.2 CPU拓撲 165
4.5.3 調度域和調度組 169
4.5.4 CPU拓撲中調度域的初始化 172
4.5.5 何時做負載均衡 173
4.5.6 負載均衡的基本過程 174
第5章 Linux系統(tǒng)開發(fā)工具 177
5.1 GDB調試工具 177
5.1.1 程序調試方法 177
5.1.2 代碼斷點 177
5.1.3 數據斷點 182
5.1.4 多線程調試 184
5.1.5 捕獲當前位置 187
5.1.6 GDB的原理 191
5.1.7 coredump文件的使用 191
5.1.8 通過網絡進行GDB遠程調試 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 關于SystemTap的兩個例子 242
5.4.4 基本原理 243
5.4.5 深入了解原理 247
第6章 人工智能技術 250
6.1 視頻編解碼主流技術及軟件框架 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 線程層次結構 256
6.2.3 CUDA的線程索引計算 257
6.2.4 CUDA的內存模型 258
6.2.5 CUDA用例 259
6.3 基礎技術介紹 261
6.3.1 GEMM算法 261
6.3.2 Resnet 263
6.3.3 KCF算法 265
6.3.4 PyTorch&LibTorch深度學習框架 270
第7章 OpenCL的編程技術 273
7.1 GPU計算與OpenCL
介紹 273
7.1.1 什么是OpenCL 273
7.1.2 OpenCL類圖 275
7.2 OpenCL架構 276
7.2.1 平臺模型 277
7.2.2 執(zhí)行模型 277
7.2.3 內存模型 282
7.2.4 編程模型 283
7.2.5 OpenCL總結 284
7.3 關于OpenCL的例子 285
7.4 平臺、上下文、設備 295
7.4.1 OpenCL平臺 295
7.4.2 設備 296
7.4.3 OpenCL上下文 298
7.5 程序對象和內核對象 300
7.5.1 程序對象 301
7.5.2 內核對象 303
7.6 緩沖區(qū) 305
7.6.1 創(chuàng)建內存對象 305
7.6.2 查詢緩沖區(qū)信息 306
7.6.3 讀、寫和復制緩沖區(qū) 306
7.6.4 映射緩沖區(qū) 314
7.7 關于OpenCL的案例研究 315
7.7.1 圖像顏色模型轉換 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內核的BiscuitOS實踐 332
8.3.1 構建基于ARM64 Linux的 BiscuitOS 332
8.3.2 基于BiscuitOS的內核源代碼實踐 333
8.3.3 基于BiscuitOS的內核模塊開發(fā) 335
8.3.4 基于BiscuitOS的應用程序開發(fā) 337
8.3.5 BiscuitOS高級實踐 338
第9章 硬件架構 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神經網絡異構加速芯片 344
9.3.1 Spring Hill硬件架構 345
9.3.2 推理計算引擎ICE 346
9.3.3 DL計算網絡 347
9.3.4 矢量處理器 348
9.3.5 內存架構 349
9.3.6 負載靈活及可擴展性 349
9.3.7 神經網絡推理計算優(yōu)化 349
9.3.8 通用神經網絡優(yōu)化 350
9.3.9 與硬件相關的神經網絡優(yōu)化 351
9.4 SystemC框架 351
9.4.1 SystemC的用途 352
9.4.2 SystemC環(huán)境搭建 353
9.4.3 一個簡單的SystemC例子 354