内容简介
近年来,随着国产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调度器线程