图书目录

目录

第1部分 背景与概览/ 1

第1章 行业背景和发展/ 2

1.1 GPGPU的历史与发展/ 2

1.1.1 早期计算机图形的发展/ 2

1.1.2 专用图形处理器的诞生/ 7

1.2 GPU的可编程化与GPGPU的萌芽/ 11

1.2.1 可编程着色器时代(2001—2006年)/ 11

1.2.2 通用计算需求的增长/ 12

1.3 GPGPU通用计算时代的兴起(2006年起)/ 14

1.3.1 统一渲染架构的引入/ 14

1.3.2 CUDA的推出与影响/ 14

1.3.3 OpenCL的出现与标准化/ 15

1.3.4 计算着色器的引入与GPGPU的成熟/ 16

1.4 光线追踪与AI时代/ 16

1.4.1 光线追踪的崛起:从离线到实时/ 16

1.4.2 AI驱动的GPU变革/ 17

1.5 GPU的未来:架构演化与技术创新/ 17

1.5.1 硬件架构的持续演化/ 17

1.5.2 网格着色器/ 18

1.5.3 封装和互连技术的演进/ 18

1.5.4 GPGPU技术的挑战/ 21

1.6 本章小结/ 22

第2章 开源项目与开发进展/ 23

2.1 主要开源GPGPU项目概览/ 23

2.1.1 OpenVGA/ 23

2.1.2 Nyuzi Processor(2012)/ 24

2.1.3 MIAOW(2015)/ 25

2.1.4 FGPU:An SIMT-Architecture for FPGAs(2016)/ 26

2.1.5 Vortex(2019)/ 27

2.1.6 乘影GPGPU/ 29

2.2 开源GPU模拟器项目概况/ 30

2.2.1 GPGPU-Sim/ 30

2.2.2 gem5-gpu/ 31

2.3 开源项目情况与分析/ 32

第2部分 GPU设计思想和指令集/ 35

第3章 从并行思想到GPGPU/ 37

3.1 指令级并行/ 37

3.1.1 流水线/ 37

3.1.2 乱序执行/ 38

3.1.3 超标量技术/ 38

3.2 线程级并行/ 39

3.2.1 粗粒度多线程/ 40

3.2.2 细粒度多线程/ 41

3.2.3 同时多线程/ 41

3.2.4 多核处理器/ 41

3.2.5 讨论/ 42

3.3 数据级并行/ 43

3.3.1 向量化与性能提升/ 43

3.3.2 Amdahl定律与向量加速的整体影响/ 45

3.3.3 内存带宽与数据获取/ 45

3.3.4 SIMD硬件的形态变换/ 47

3.3.5 NPU/ 48

3.4 GPGPU/ 51

3.5 比较、讨论和小结/ 55

3.5.1 横向对比/ 55

3.5.2 软硬件协同优化新趋势/ 56

第4章 NVIDIA GPU指令集/ 57

4.1 寄存器/ 59

4.1.1 通用寄存器/ 59

4.1.2 特殊寄存器/ 59

4.1.3 Predicate寄存器/ 60

4.1.4 Uniform寄存器/ 61

4.1.5 讨论/ 61

4.2 内存和缓存/ 61

4.3 运算/ 62

4.3.1 浮点数运算/ 62

4.3.2 整数运算/ 65

4.3.3 Warp级别运算/ 66

4.4 本章小结/ 66

第5章 AMD GPU指令集/ 68

5.1 架构简介/ 69

5.2 寄存器/ 70

5.2.1 控制寄存器/ 70

5.2.2 通用寄存器/ 70

5.3 指令格式/ 71

5.3.1 常用指令字段/ 71

5.3.2 缓存控制修饰符/ 72

5.4 程序控制指令/ 73

5.5 标量指令/ 73

5.6 向量指令/ 74

5.6.1 编码格式及特点/ 74

5.6.2 16b计算/ 74

5.6.3 VOPD:双发射计算/ 75

5.6.4 矩阵乘加指令/ 75

5.7 内存和缓存/ 76

5.7.1 Flat访存/ 77

5.7.2 Global访存/ 78

5.7.3 Scratch访存/ 78

5.8 本章小结/ 78

第6章 RISC-V及其向量扩展/ 80

6.1 RISC-V指令集概述/ 80

6.1.1 RISC-V起源/ 80

6.1.2 RISC-V架构特点/ 80

6.2 RISC-V指令集/ 81

6.2.1 基础指令集/ 81

6.2.2 扩展指令集/ 83

6.3 RISC-V向量扩展概述/ 85

6.3.1 向量扩展的引入/ 85

6.3.2 向量寄存器和状态映射/ 86

6.3.3 RISC-V向量扩展的关键特性/ 86

6.4 RISC-V向量扩展的指令集/ 87

6.4.1 向量扩展指令集格式/ 87

6.4.2 向量masking/ 89

6.5 RISC-V向量扩展的应用/ 89

第7章 乘影GPGPU指令集/ 90

7.1 编程模型映射方案/ 90

7.2 指令设计说明/ 92

7.2.1 RISC-V标量指令/ 92

7.2.2 RISC-V向量指令/ 93

7.3 自定义指令/ 93

7.3.1 分支控制指令/ 94

7.3.2 寄存器扩展指令/ 95

7.3.3 同步和任务控制指令/ 96

7.3.4 自定义矩阵乘加指令/ 98

7.3.5 自定义计算指令/ 99

7.3.6 自定义访存指令/ 99

7.3.7 自定义64位地址空间立即数访存指令/ 101

7.3.8 自定义异步复制指令/ 101

7.3.9 自定义访存前缀指令/ 103

7.3.10 自定义计算前缀指令/ 104

7.4 寄存器/ 105

7.4.1 通用寄存器堆设计方案/ 105

7.4.2 CSR方案/ 105

7.4.3 应用程序二进制接口/ 106

7.5 内存模型和内存分配方案/ 106

7.6 本章小结/ 107

第3部分 乘影GPGPU硬件微架构/ 109

第8章 流式多处理器单元核心微架构/ 111

8.1 线程束调度器/ 114

8.1.1 线程束调度器架构/ 115

8.1.2 线程束调度的讨论/ 117

8.2 流水线前端设计/ 120

8.2.1 取指单元/ 120

8.2.2 译码单元/ 122

8.2.3 指令缓冲/ 124

8.2.4 记分板/ 126

8.2.5 线程分支与SIMT-Stack/ 127

8.2.6 SIMT分支的讨论/ 129

8.3 流水线后端设计/ 133

8.3.1 操作数收集器和寄存器文件/ 133

8.3.2 标量单元/ 136

8.3.3 浮点数乘法器/ 139

8.3.4 向量执行单元/ 142

8.3.5 特殊函数单元/ 145

8.3.6 乘法单元/ 147

8.3.7 LSU/ 147

8.3.8 写回单元/ 150

8.3.9 标量与仿射数据模式的扩展讨论/ 151

8.4 本章小结/ 152

第9章 CTA调度器/ 153

9.1 线程块调度策略概述/ 154

9.1.1 防止资源拥塞与负载不均的节流调度策略/ 154

9.1.2 针对线程块间空间局部性的调度策略/ 155

9.1.3 针对多内核函数的调度策略/ 156

9.2 线程块调度器的功能概述/ 157

9.3 线程块调度器的基本结构/ 158

9.3.1 顶层设计/ 159

9.3.2 子模块功能/ 159

9.4 资源判定流程/ 160

9.4.1 资源表缓存的语义/ 161

9.4.2 资源表缓存的项数/ 163

9.4.3 本节小结/ 165

9.5 硬件实现/ 165

9.5.1 线程块缓冲区/ 165

9.5.2 资源分配器/ 166

9.5.3 资源表/ 169

9.5.4 计算单元接口/ 172

9.5.5 线程索引/ 173

9.6 功能断言/ 174

9.7 本章小结/ 175

第10章 乘影GPGPU缓存子系统/ 176

10.1 共享内存系统的内存模型/ 176

10.1.1 共享内存系统的一致性、同步、连贯性/ 176

10.1.2 内存模型/ 179

10.2 连贯性指导的缓存一致性设计方案/ 189

10.3 GPGPU存储系统概述/ 190

10.3.1 GPGPU的片上存储系统/ 190

10.3.2 GPGPU缓存系统特点/ 191

10.3.3 共享内存设计与Bank Conflict/ 192

10.3.4 融合内存/ 194

10.4 一级缓存子系统硬件设计/ 195

10.4.1 一级缓存子系统接口/ 195

10.4.2 DCache设计概览/ 199

10.4.3 子模组设计/ 202

10.4.4 访存单元请求流水线时序行为/ 208

10.4.5 二级缓存响应流水线时序行为/ 210

10.5 二级缓存子系统硬件设计/ 210

10.6 原子模块硬件设计/ 213

10.6.1 原子操作介绍/ 213

10.6.2 原子模块硬件设计/ 214

10.7 通用图形处理器的访存特点及优化方向/ 217

10.8 本章小结/ 218

第11章 内存管理单元/ 219

11.1 引言/ 219

11.2 内存管理单元与虚拟内存技术概述/ 219

11.2.1 MMU的定义/ 220

11.2.2 虚拟内存/ 220

11.2.3 RISC-V的虚拟内存规范/ 221

11.2.4 GPU上的虚拟地址/ 223

11.3 乘影GPGPU中的MMU设计/ 225

11.3.1 一级TLB/ 225

11.3.2 二级TLB系统/ 226

11.3.3 辅助TLB存储/ 227

11.3.4 页表遍历转换单元/ 228

11.3.5 根页表地址映射表与地址空间管理/ 229

11.3.6 本节小结/ 229

11.3.7 软件页表维护/ 230

11.4 拓展讨论/ 230

11.5 本章小结/ 231

第12章 张量计算系统/ 233

12.1 Tensor Core/ 233

12.1.1 神经网络计算特征/ 234

12.1.2 张量计算单元/ 241

12.1.3 乘影GPGPU Tensor Core设计/ 248

12.1.4 讨论/ 252

12.2 Direct Memory Engine/ 253

12.2.1 数据访存加速器设计背景/ 253

12.2.2 乘影GPGPU的DMA Engine架构设计/ 258

12.3 本章小结/ 268

第4部分 乘影GPGPU软件工具链/ 269

第13章 OpenCL编程模型介绍/ 270

13.1 执行模型/ 271

13.2 软件线程与硬件资源/ 275

13.3 存储模型/ 276

13.4 本章小结/ 278

第14章 基于OpenCL的编译器设计/ 279

14.1 编译器的基本概念/ 279

14.1.1 编译器的工作流程/ 279

14.1.2 编译器的结构组成/ 280

14.1.3 编译器的类型/ 280

14.1.4 编译器与解释器的区别/ 281

14.2 编译器的作用和重要性/ 281

14.3 为什么选择LLVM/ 282

14.3.1 架构与灵活性/ 282

14.3.2 优化能力与跨平台社区生态/ 283

14.3.3 面向未来的机器学习与MLIR集成/ 283

14.4 LLVM编译器概述/ 284

14.4.1 LLVM的历史与发展/ 284

14.4.2 LLVM的架构/ 284

14.5 LLVM编译器的模块化架构/ 286

14.5.1 前端/ 286

14.5.2 中端/ 288

14.5.3 后端/ 294

14.6 OpenCL和乘影GPGPU编译器的结合/ 301

14.6.1 OpenCL C编程语言/ 301

14.6.2 Clang编译器编译OpenCL C的流程/ 304

14.6.3 OpenCL C的libclc函数库/ 305

第15章 驱动工具链/ 308

15.1 OpenCL运行时工作流程/ 308

15.2 OpenCL运行时实现/ 311

15.2.1 设备信息/ 311

15.2.2 OpenCL命令队列与事件修改/ 311

15.2.3 内存管理/ 312

15.2.4 设备执行/ 313

15.3 乘影驱动程序设计/ 315

15.3.1 硬件抽象层API/ 316

15.3.2 进程管理/ 316

15.3.3 基于驱动程序的虚拟设备实现/ 317

15.4 本章小结/ 318

参考文献/ 319