内容介绍
《CUDA专家手册:GPU编程权威指南》由英伟达公司CUDA首席架构师Nicholas Wilt亲笔撰写,深度解析GPU的架构、系统软件、编程环境,以及CUDA编程各方面的知识和各种优化技术,包含大量实用代码示例,是并行程序开发领域最有影响力的著作之一。
《CUDA专家手册:GPU编程权威指南》分为三部分,共15章。第一部分(第1~4章)介绍CUDA开发的基础知识、硬件/软件架构和软件环境;第二部分(第5~10章)详细解析CUDA开发的各个方面,包括内存、流与事件、内核执行、流处理器簇、多gpu编程和纹理操作;第三部分(第11~15章)利用多个实例,深入分析流式负载、归约算法、扫描算法、N-体问题和图像处理的归一化相关系数计算,介绍如何应用各种优化技术。
目录
- 《CUDA专家手册:GPU编程权威指南》
- 中文版序
- 推荐序
- 译者序
- 前言
- 第一部分基础知识
- 第1章简介2
- 1.1方法4
- 1.2代码4
- 1.2.1验证型代码5
- 1.2.2演示型代码5
- 1.2.3探究型代码5
- 1.3资源5
- 1.3.1开源代码5
- 1.3.2cuda专家手册库(chlib)6
- 1.3.3编码风格6
- 1.3.4cuda sdk6
- 1.4结构6
- 第2章硬件架构8
- 2.1cpu配置8
- 2.1.1前端总线9
- 2.1.2对称处理器簇9
- 2.1.3非一致内存访问(numa)10
- 2.1.4集成的pcie12
- 2.2集成gpu13
- 2.3多gpu14
- 2.4cuda中的地址空间17
- 2.4.1虚拟寻址简史17
- 2.4.2不相交的地址空间20
- 2.4.3映射锁页内存21
- 2.4.4可分享锁页内存21
- 2.4.5统一寻址23
- 2.4.6点对点映射24
- 2.5cpu/gpu交互24
- 2.5.1锁页主机内存和命令缓冲区25
- 2.5.2cpu/gpu并发26
- 2.5.3主机接口和内部gpu同步29
- 2.5.4gpu间同步31
- 2.6gpu架构31
- 2.6.1综述31
- 2.6.2流处理器簇34
- 2.7延伸阅读37
- 第3章软件架构39
- 3.1软件层39
- 3.1.1cuda运行时和驱动程序40
- 3.1.2驱动程序模型41
- 3.1.3nvcc、ptx和微码43
- 3.2设备与初始化45
- 3.2.1设备数量46
- 3.2.2设备属性46
- 3.2.3无cuda支持情况48
- 3.3上下文50
- 3.3.1生命周期与作用域51
- 3.3.2资源预分配51
- 3.3.3地址空间52
- 3.3.4当前上下文栈52
- 3.3.5上下文状态53
- 3.4模块与函数53
- 3.5内核(函数)55
- 3.6设备内存56
- 3.7流与事件57
- 3.7.1软件流水线57
- 3.7.2流回调57
- 3.7.3null流57
- 3.7.4事件58
- 3.8主机内存59
- 3.8.1锁页主机内存60
- 3.8.2可分享的锁页内存60
- 3.8.3映射锁页内存60
- 3.8.4主机内存注册60
- 3.9cuda数组与纹理操作61
- 3.9.1纹理引用61
- 3.9.2表面引用63
- 3.10图形互操作性63
- 3.11cuda运行时与cuda驱动程序api65
- 第4章软件环境69
- 4.1nvcc——cuda编译器驱动程序69
- 4.2ptxas——ptx汇编工具73
- 4.3cuobjdump76
- 4.4nvidia-smi77
- 4.5亚马逊web服务79
- 4.5.1命令行工具79
- 4.5.2ec2和虚拟化79
- 4.5.3密钥对80
- 4.5.4可用区域(az)和地理区域81
- 4.5.5s381
- 4.5.6ebs81
- 4.5.7ami82
- 4.5.8ec2上的linux82
- 4.5.9ec2上的windows83
- 第二部分cuda编程
- 第5章内存88
- 5.1主机内存89
- 5.1.1分配锁页内存89
- 5.1.2可共享锁页内存90
- 5.1.3映射锁页内存90
- 5.1.4写结合锁页内存91
- 5.1.5注册锁页内存91
- 5.1.6锁页内存与统一虚拟寻址92
- 5.1.7映射锁页内存用法92
- 5.1.8numa、线程亲和性与锁页内存93
- 5.2全局内存95
- 5.2.1指针96
- 5.2.2动态内存分配97
- 5.2.3查询全局内存数量100
- 5.2.4静态内存分配101
- 5.2.5内存初始化api102
- 5.2.6指针查询103
- 5.2.7点对点内存访问104
- 5.2.8读写全局内存105
- 5.2.9合并限制105
- 5.2.10验证实验:内存峰值带宽107
- 5.2.11原子操作111
- 5.2.12全局内存的纹理操作113
- 5.2.13ecc(纠错码)113
- 5.3常量内存114
- 5.3.1主机与设备常量内存114
- 5.3.2访问常量内存114
- 5.4本地内存115
- 5.5纹理内存118
- 5.6共享内存118
- 5.6.1不定大小共享内存声明119
- 5.6.2束同步编码119
- 5.6.3共享内存的指针119
- 5.7内存复制119
- 5.7.1同步内存复制与异步内存复制120
- 5.7.2统一虚拟寻址121
- 5.7.3cuda运行时121
- 5.7.4驱动程序api123
- 第6章流与事件125
- 6.1cpu/gpu的并发:隐藏驱动程序开销126
- 6.2异步的内存复制129
- 6.2.1异步的内存复制:主机端到设备端130
- 6.2.2异步内存复制:设备端到主机端130
- 6.2.3null流和并发中断131
- 6.3cuda事件:cpu/gpu同步133
- 6.3.1阻塞事件135
- 6.3.2查询135
- 6.4cuda事件:计时135
- 6.5并发复制和内核处理136
- 6.5.1concurrencymemcpykernel.cu137
- 6.5.2性能结果141
- 6.5.3中断引擎间的并发性142
- 6.6映射锁页内存143
- 6.7并发内核处理145
- 6.8gpu/gpu同步:cudastreamwaitevent()146
- 6.9源代码参考147
- 第7章内核执行148
- 7.1概况148
- 7.2语法149
- 7.2.1局限性150
- 7.2.2高速缓存和一致性151
- 7.2.3异步与错误处理151
- 7.2.4超时152
- 7.2.5本地内存152
- 7.2.6共享内存153
- 7.3线程块、线程、线程束、束内线程153
- 7.3.1线程块网格153
- 7.3.2执行保证156
- 7.3.3线程块与线程id156
- 7.4占用率159
- 7.5动态并行160
- 7.5.1作用域和同步161
- 7.5.2内存模型162
- 7.5.3流与事件163
- 7.5.4错误处理163
- 7.5.5编译和链接164
- 7.5.6资源管理164
- 7.5.7小结165
- 第8章流处理器簇167
- 8.1内存168
- 8.1.1寄存器168
- 8.1.2本地内存169
- 8.1.3全局内存170
- 8.1.4常量内存171
- 8.1.5共享内存171
- 8.1.6栅栏和一致性173
- 8.2整型支持174
- 8.2.1乘法174
- 8.2.2其他操作(位操作)175
- 8.2.3漏斗移位(sm 3.5)175
- 8.3浮点支持176
- 8.3.1格式176
- 8.3.2单精度(32位)180
- 8.3.3双精度(64位)181
- 8.3.4半精度(16位)181
- 8.3.5案例分析:float到half的转换182
- 8.3.6数学函数库185
- 8.3.7延伸阅读190
- 8.4条件代码191
- 8.4.1断定191
- 8.4.2分支与汇聚191
- 8.4.3特殊情况:最小值、最大值和绝对值192
- 8.5纹理与表面操作193
- 8.6其他指令193
- 8.6.1线程束级原语193
- 8.6.2线程块级原语194
- 8.6.3性能计数器195
- 8.6.4视频指令195
- 8.6.5特殊寄存器196
- 8.7指令集196
- 第9章多gpu203
- 9.1概述203
- 9.2点对点机制204
- 9.2.1点对点内存复制204
- 9.2.2点对点寻址205
- 9.3uva:从地址推断设备206
- 9.4多gpu间同步207
- 9.5单线程多gpu方案208
- 9.5.1当前上下文栈208
- 9.5.2n-体问题210
- 9.6多线程多gpu方案212
- 第10章纹理操作216
- 10.1简介216
- 10.2纹理内存217
- 10.2.1设备内存217
- 10.2.2cuda数组与块的线性寻址218
- 10.2.3设备内存与cuda数组对比222
- 10.3一维纹理操作223
- 10.4纹理作为数据读取方式226
- 10.4.1增加有效地址范围226
- 10.4.2主机内存纹理操作228
- 10.5使用非归一化坐标的纹理操作230
- 10.6使用归一化坐标的纹理操作237
- 10.7一维表面内存的读写238
- 10.8二维纹理操作240
- 10.9二维纹理操作:避免复制242
- 10.9.1设备内存上的二维纹理操作242
- 10.9.2二维表面内存的读写243
- 10.10三维纹理操作244
- 10.11分层纹理245
- 10.11.1一维分层纹理246
- 10.11.2二维分层纹理246
- 10.12最优线程块大小选择以及性能246
- 10.13纹理操作快速参考248
- 10.13.1硬件能力248
- 10.13.2cuda运行时249
- 10.13.3驱动api250
- 第三部分实例
- 第11章流式负载254
- 11.1设备内存255
- 11.2异步内存复制258
- 11.3流259
- 11.4映射锁页内存260
- 11.5性能评价与本章小结261
- 第12章归约算法263
- 12.1概述263
- 12.2两遍归约265
- 12.3单遍归约269
- 12.4使用原子操作的归约271
- 12.5任意线程块大小的归约272
- 12.6适应任意数据类型的归约273
- 12.7基于断定的归约276
- 12.8基于洗牌指令的线程束归约277
- 第13章扫描算法278
- 13.1定义与变形278
- 13.2概述279
- 13.3扫描和电路设计281
- 13.4cuda实现284
- 13.4.1先扫描再扇出284
- 13.4.2先归约再扫描(递归)288
- 13.4.3先归约再扫描(两阶段)291
- 13.5线程束扫描294
- 13.5.1零填充295
- 13.5.2带模板的版本296
- 13.5.3线程束洗牌297
- 13.5.4指令数对比298
- 13.6流压缩300
- 13.7参考文献(并行扫描算法)302
- 13.8延伸阅读(并行前缀求和电路)303
- 第14章n-体问题304
- 14.1概述305
- 14.2简单实现309
- 14.3基于共享内存实现312
- 14.4基于常量内存实现313
- 14.5基于线程束洗牌实现315
- 14.6多gpu及其扩展性316
- 14.7cpu的优化317
- 14.8小结321
- 14.9参考文献与延伸阅读323
- 第15章图像处理的归一化相关系数计算324
- 15.1概述324
- 15.2简单的纹理实现326
- 15.3常量内存中的模板329
- 15.4共享内存中的图像331
- 15.5进一步优化334
- 15.5.1基于流处理器簇的实现代码334
- 15.5.2循环展开335
- 15.6源代码336
- 15.7性能评价337
- 15.8延伸阅读339
- 附录acuda专家手册库340
- 术语表347