計算機系統開發與優化實戰

周文嘉//劉盼//王鈺達 等著

  • 出版商: 人民郵電
  • 出版日期: 2022-08-01
  • 售價: $659
  • 貴賓價: 9.5$626
  • 語言: 簡體中文
  • 頁數: 358
  • 裝訂: 平裝
  • ISBN: 7115592888
  • ISBN-13: 9787115592880
  • 相關分類: CUDALinux
  • 立即出貨 (庫存 < 3)

買這商品的人也買了...

商品描述

本書首先介紹通用處理器的架構,以及彙編和編譯的技術;
然後講解Linux 內存和進程管理, 以及GDB、trace、eBPF、SystemTap 等Linux 系統開發工具;
接著通過視頻編解碼主流技術和NVIDIA 計算平台CUDA 等討論人工智能技術在音視頻領域與自然語言處理領域的應用;
最後講解標準計算平台OpenCL 的原理、開源硬件soDLA、Intel 神經網絡異構加速芯片、SystemC 框架。
本書適合從事企業系統開發及優化的技術人員閱讀,
也可供計算機相關專業的師生參考。

作者簡介

周文嘉
目前就職於某國產AI GPU 芯片公司,曾服務於ARM、阿里巴巴、HTC 等公司,擁有10 年以上工作經驗,
主要從事系統軟件開發,涵蓋系統庫開發、指令集優化、Linux 內核開發等,
為某些開源社貢獻過一定數量的補丁,擔任Free time team 創始人,致力於免費教育事業。

劉盼
目前就職於某國際芯片公司,曾服務於三星電子研究所、某自動駕駛科技公司,
具有手機、汽車和芯片行業的工作經驗,創辦4 萬多人的極客社區—“人人都是極客”,
擔任某科技公司合夥人,是谷歌開發者社區優秀講師。

王鈺達
加州大學伯克利分校和伊利諾伊理工學院雙碩士,目前專注於RISC-V 工具鏈、
NVDLA 工具鏈、自定義自動駕駛相關加速器芯片前端和後端設計的敏捷開發。

目錄大綱

目錄
第1章通用處理器架構簡介1
1.1 綜述1
1.2 AArch64寄存器堆2
1.2.1 通用寄存器2
1.2.2 特殊寄存器2
1.2.3 系統控制寄存器2
1.2.4 處理器狀態3
1.2.5 函數調用標準4
1.3 流水線5
1.3.1 Cortex-A77微架構5
1.3.2 微架構與代碼優化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 系統安全增強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 位運算通用優化技巧23
2.1.2 利用ARM的ubfiz等指令優化位操作23
2.1.3 指令與數據保序24
2.2 ARM64 NEON技術24
2.2.1 NEON寄存器25
2.2.2 調試環境27
2.2.3 NEON編程28
2.2.4 不同NEON開發方式的比較37
2.2.5 SIMD優化技巧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的實現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優化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 分區頁幀分配器67
3.3.1 夥伴算法77
3.3.2 水位控制84
3.3.3 內存回收88
3.3.4 碎片頁面規整91
3.4 slab分配器及kmalloc的實現96
3.4.1 走進slab分配器96
3.4.2 數據結構98
3.4.3 流程分析100
3.4.4 kmalloc的實現101
3.5 vmalloc()的原理和實現103
3.5.1 數據結構103
3.5.2 vmalloc()的實現105
3.6 malloc()/mmap()的原理和實現107
3.6.1 認識VMA 107
3.6.2 malloc()的實現112
3.6.3 認識mm->brk 112
3.6.4 mmap()的實現114
3.7 缺頁異常處理115
3.7.1 匿名頁面缺頁中斷120
3.7.2 文件映射缺頁中斷122
3.7.3 頁被交換到交換分區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 用戶態進程/線程的創建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()函數的實現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 多核系統的負載均衡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系統開發工具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的出現和發展歷史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 執行模型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 緩衝區305
7.6.1 創建內存對象305
7.6.2 查詢緩衝區信息306
7.6.3 讀、寫和復制緩衝區306
7.6.4 映射緩衝區314
7.7 關於OpenCL的案例研究315
7.7.1 圖像顏色模型轉換315
7.7.2 圖像縮放317
7.7.3 高斯模糊320
第8章一些開源項目323
8.1 ISA-L開源項目優化技巧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的內核模塊開發335
8.3.4 基於BiscuitOS的應用程序開發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 神經網絡推理計算優化349
9.3.8 通用神經網絡優化350
9.3.9 與硬件相關的神經網絡優化351
9.4 SystemC框架351
9.4.1 SystemC的用途352
9.4.2 SystemC環境搭建353
9.4.3 一個簡單的SystemC例子354