商品描述
近年來,隨著國產Linux桌面系統的逐步推廣、使用Linux內核的Android系統的發展和使用Linux服務器的雲遊戲服務的普及,Linux下的實時渲染應用越來越廣。同時隨著大模型計算的蓬勃發展,顯卡越來越成為計算系統的核心組件。但是Linux下的渲染架構與顯卡驅動一直缺少資料。本書以AMD顯卡為例,主要闡述顯卡計算的原理和顯卡驅動的組織方式,並對Linux用戶空間到內核空間的渲染架構的原理和變化進行了深入解釋。包括了從X到Wayland和Android的圖形架構的變化和渲染API的系統層工作原理。同時闡述了大模型計算的底層硬件原理。本書主要基於AMD顯卡和Linux下的開源驅動,從用戶空間驅動、內核空間驅動、固件和顯卡硬件四個方向分析現代顯卡的渲染與計算的工作原理。第1章與第2章主要介紹顯卡用於渲染、計算和合成的硬件結構;第3章與第4章主要介紹用戶空間驅動;第5章到第8章主要介紹顯卡內核空間驅動,其中,第5章系統性地介紹AMD顯卡內核空間驅動的架構,第6章主要介紹顯卡的GPU任務調度器,第7章與第8章主要關註顯存管理;第9章主要分析顯卡的頻率、電壓與功耗的關系;第10章主要介紹顯卡在大規模AI計算中的應用與性能優化。遊戲與渲染相關開發人員、桌面操作系統的開發人員、希望了解GPU計算原理的AI計算開發人員、希望學習顯示架構和AI計算的大學生。
目錄大綱
目錄
第1章 顯卡的硬件結構 1
1.1 AMD顯卡的歷史與核心技術 1
1.1.1 GCN與RDNA 1
1.1.2 顯卡的分類 2
1.1.3 AMD顯卡的主要技術 3
1.2 顯卡的計算硬件結構 6
1.2.1 CPU與GPU的硬件區別 6
1.2.2 著色器的執行硬件 7
1.2.3 顯卡指令集 8
1.2.4 SIMT、SIMD與SMT 9
1.2.5 SPU、SIMD與CU 10
1.2.6 線程、Wave與工作組 12
1.2.7 GCN的並行問題和RDNA的解決辦法 13
1.2.8 SE 15
1.2.9 顯卡並行的性能問題 16
1.3 顯卡的硬件圖形管線 17
1.3.1 圖形流水線 17
1.3.2 硬件管線的低功耗:IMR、TBR與TBDR 20
1.3.3 顯卡的壓縮紋理 27
1.3.4 硬件圖形管線的計算著色器通用化 29
1.4 顯卡的內存硬件結構 31
1.4.1 獨立顯卡與集成顯卡的顯存區別 31
1.4.2 顯卡內部的內存結構 32
1.4.3 顯存的分類 34
1.4.4 內存的檢測和糾正 36
1.5 顯卡的顯示輸出 38
1.5.1 顯示方式 38
1.5.2 DCC與EDID 39
第2章 合成與顯示 41
2.1 DRI 41
2.1.1 非直接渲染 41
2.1.2 DRI1 42
2.1.3 DRI2 43
2.1.4 DRI3 44
2.2 X、Wayland、SurfaceFlinger與WindowManager 45
2.2.1 X 45
2.2.2 Wayland 47
2.2.3 SurfaceFlinger與WindowManager 49
2.3 FrameBuffer與送顯 51
2.3.1 FrameBuffer 51
2.3.2 Android的FrameBuffer管理 53
2.3.3 送顯與DC 55
2.4 合成與DPU、VPU 61
2.5 Linux內核的合成與送顯:KMS 64
2.5.1 KMS與送顯 64
2.5.2 KMS的主要組件 65
2.5.3 KMS送顯結構的創建 69
2.6 DRI在未來雲化渲染的新挑戰與趨勢 70
2.6.1 離屏渲染的發展 70
2.6.2 Android手遊的雲端運行 72
第3章 三維圖形渲染管線 78
3.1 三維渲染中的三維坐標與模型文件表示 78
3.1.1 坐標系統 78
3.1.2 頂點表示與obj模型文件的格式 79
3.2 DirectX、OpenGL與Vulkan 80
3.2.1 DirectX 80
3.2.2 OpenGL 83
3.2.3 Vulkan 85
3.3 Vulkan API的整體架構 88
3.3.1 Vulkan管理組件 88
3.3.2 Vulkan管線組件 90
3.3.3 Vulkan資源組件:VkBuffer與VkImage 93
3.3.4 Vulkan同步組件 96
3.4 Vulkan與AMD GPU驅動之間的功能映射關系 103
3.4.1 Vulkan:渲染硬件的用戶空間驅動接口 103
3.4.2 顯卡與隊列 103
3.4.3 VkDeviceMemory 108
3.4.4 BO與Vulkan資源的使用:管線拓撲 113
3.4.5 job與VkCommandBuffer 115
3.4.6 Vulkan通用計算與AMD顯卡的硬件並行結構 116
第4章 用戶空間渲染驅動 119
4.1 OpenGL與Vulkan的運行時 119
4.1.1 OpenGL與EGL 119
4.1.2 Vulkan 122
4.2 libdrm與KMS用戶空間接口 124
4.2.1 libdrm 124
4.2.2 KMS用戶空間接口 126
4.3 用戶空間渲染驅動:Mesa 130
4.3.1 用戶空間渲染驅動框架:Gallium3D 130
4.3.2 AMD Vulkan實現:RADV 133
4.3.3 其他渲染API實現 134
4.3.4 著色器 134
4.4 軟管線:swrast與SwiftShader 136
4.4.1 Mesa的軟管線:swrast 136
4.4.2 Google的軟管線:SwiftShader 137
4.4.3 SwiftShader與Lavapipe的對比 139
4.5 渲染API的自動化生成:FrameGraph 140
4.5.1 RenderPass與FrameGraph的產生 140
4.5.2 FrameGraph下的Vulkan使用方式 140
第5章 DRM與AMD GPU顯卡驅動 142
5.1 DRM子系統 142
5.1.1 KMS、GEM與TTM、SCHED 142
5.1.2 DRM ioctl標準接口 143
5.1.3 DRM的模塊參數 146
5.1.4 DRM與閉源驅動的現狀 147
5.2 AMD顯卡驅動AMD GPU 147
5.2.1 AMD顯卡驅動 147
5.2.2 AMD GPU的用戶空間接口 151
5.3 IP模塊與顯卡固件 153
5.3.1 IP模塊 153
5.3.2 顯卡固件 159
5.4 顯卡命令執行隊列 160
5.4.1 PM4數據包與CP 160
5.4.2 PM4的格式 162
5.5 中斷與異常 163
5.5.1 AMD顯卡的中斷結構 163
5.5.2 顯卡的異常處理:GPU Reset 164
5.6 AMD GPU使用的Linux公共子框架 165
5.6.1 傳感器與硬件監控框架 165
5.6.2 PCIe BAR 168
第6章 GPU任務調度器 172
6.1 job與GPU任務調度器 172
6.1.1 job與GPU任務調度器的概念 172
6.1.2 Entity與Entity優先級隊列 172
6.1.3 GPU任務調度器 173
6.2 Fence、DMA Reservation與DMA-BUF 174
6.2.1 Fence 174
6.2.2 DMA Reservation 178
6.2.3 DMA-BUF 185
6.3 job的下發:GPU調度器線程 187
6.3.1 GPU調度器線程的主要回調函數 187
6.3.2 GPU調度器線程的主體邏輯 189
6.3.3 DRM Sched Fence與job異常處理 196
6.3.4 AMD GPU的Entity擴展 197
6.4 job的產生 198
6.4.1 GPU調度器線程負載均衡 198
6.4.2 job的ioctl入口 200
6.5 GPU任務調度器的內部結構 202
6.5.1 GPU調度器線程的主要數據結構 202
6.5.2 AMD GPU的調度上下文 204
第7章 GEM、TTM與AMD GPU對象 208
7.1 GEM與TTM的整體概念 208
7.1.1 GEM與TTM 208
7.1.2 BO的類型與關系 209
7.1.3 用於CPU渲染的VGEM 210
7.2 顯存類型:GEM Domain與TTM Place 210
7.2.1 GEM Domain 210
7.2.2 TTM Place 212
7.3 GEM BO、TTM BO與AMD GPU BO 216
7.3.1 GEM BO 216
7.3.2 TTM BO 218
7.3.3 AMD GPU BO 219
7.4 TTM BO的創建與內存分配 223
7.4.1 TTM BO的創建 223
7.4.2 TTM內存分配管理器 225
7.4.3 TTM系統內存的非固定映射管理器:struct ttm_tt 228
7.5 TTM的顯存交換機制:Evict 230
7.5.1 Evict的作用 230
7.5.2 Evict的流程 230
7.6 BO的CPU映射訪問 234
7.6.1 GEM BO的mmap映射 234
7.6.2 TTM BO的CPU內存訪問操作 236
7.6.3 Resizable BAR 237
第8章 應用使用的顯卡地址空間:GPUVM 239
8.1 GPU的地址空間:GPUVM與VMID 239
8.1.1 前IOMMU時代:UMA與GART 239
8.1.2 現代AMD GPU的內存訪問:GPUVM 240
8.1.3 GPUVM的地址空間:VMID 241
8.1.4 PASID與VMID的映射 244
8.2 VMID頁表與BO狀態機 245
8.2.1 VMID頁表 245
8.2.2 BO狀態機 249
第9章 功率控制 252
9.1 結溫與溫度墻 252
9.1.1 結溫與溫度墻的定義 252
9.1.2 硬件之間的協作防撞溫度墻 254
9.1.3 軟件與硬件協作防撞溫度墻 257
9.2 功耗與散熱 257
9.2.1 功耗的組成:靜態功耗與動態功耗 257
9.2.2 散熱的原理 260
9.3 電壓與頻率 266
9.3.1 供電電壓 266
9.3.2 運行電壓 268
9.3.3 頻率 271
9.3.4 制造工藝的頻率電壓價值 272
9.4 顯存訪問的吞吐與延遲 272
9.4.1 顯存的結構 272
9.4.2 吞吐與延遲 273
9.4.3 RAS 275
9.5 顯卡超頻 276
9.5.1 超頻的原理 276
9.5.2 AMD GPU超頻 278
9.6 動態功耗調整 280
9.6.1 DVFS與DPM 280
9.6.2 功能開關的功耗控制技術 283
9.6.3 其他的顯卡功耗控制技術 283
9.7 VBIOS與Atom BIOS 283
9.7.1 VBIOS 283
9.7.2 Atom BIOS 284
第10章 顯卡的並行計算與大模型計算 286
10.1 顯卡的並行結構 286
10.1.1 顯卡的並行計算硬件 286
10.1.2 AMD顯卡的並行計算框架:ROCm 289
10.2 並行計算API與集合通信 290
10.2.1 硬件從渲染卡到計算卡 290
10.2.2 並行計算的分類 292
10.2.3 MPI 294
10.3 AI模型的統一架構 296
10.3.1 AI模型的通用概念 296
10.3.2 模型的顯存占用 300
10.4 大型模型訓練的跨卡跨機計算 303
10.4.1 並行訓練模型 303
10.4.2 分布式訓練優化策略 306
附錄A AMD GPU術語 309