CUDA是用来促进并行程序开发的一种计算架构。它与各种广泛的软件平台一起使用,使得程序员在构建高性能的应用程序的时候,可以借助图形处理单元(GPU)的强大力量。尽管GPU在图形和游戏编程领域应用多年,现在,CUDA使得开发其他领域的应用程序的程序员,也能够使用GPU的宝贵资源。本书由CUDA软件平台团队的两位高级成员撰写,介绍程序员如何利用这一新的技术。作者介绍了CUDA的各个方面,及其高级功能,还介绍了如何使用CUDA C扩展,以及如何编写真正表现出优秀性能的CUDA软件。
并行计算已成为突破摩尔定理局限性的重要研究方向,而GPU强大的并行计算能力也因此吸引了全球广泛的研究兴趣。然而,在实现通用并行计算时,GPU计算模式存在着一些限制。首先,GPU的设计初衷是为了加速应用程序中的图形绘制运算,因此开发人员需要通过OpenGL或者DirectX等API来访问GPU,这不仅要求开发人员掌握一定的图形编程知识,而且要想方设法将通用计算问题转换为图形计算问题。其次,GPU与多核CPU在计算架构上有着很大不同,GPU更注重于数据并行计算,即在不同的数据上并行执行相同的计算,而对并行计算中的互斥性、同步性以及原子性等方面支持不足。这些因素都限制了GPU在通用并行计算中的应用范围。
CUDA架构的出现解决了上述问题。CUDA架构专门为GPU计算设计了一种全新的结构,目的正是为了减轻GPU计算模型中的这些限制。在CUDA架构下,开发人员可以通过CUDA C对GPU编程。CUDA C是对标准C的一种简单扩展,学习和使用起来都非常容易,并且其最大的优势在于不需要开发人员具备图形学知识。
本书的主要内容是介绍如何通过CUDA C来编写在GPU上运行的并行程序。本书首先介绍了CUDA架构的应用背景,并给出了如何配置CUDA C的开发环境。然后,本书通过矢量求和运算、矢量点积运算、光线跟踪、热传导模拟、直方图统计等示例详细介绍了CUDA C的基本语法和使用模式。在这些示例中还穿插介绍了GPU的各种硬件特性及适用环境,例如常量内存、事件、纹理内存、图形互操作性、原子操作、流以及多GPU架构等。
这些示例的构思以及分析过程都很容易理解,它们也是本书最具价值的部分。读者在阅读这些内容时要反复思考,做到融会贯通,举一反三。只要掌握了这些简单的示例,更复杂的问题也能迎刃而解。本书适合所有程序员阅读,只需具备基本的C语言知识即可。最后,本书还给出了CUDA C的其他一些参考资源。
参与本书翻译工作的主要有李杨、吴汉平、徐光景、童胜汉、陈军、胡凯等。由于译者的时间和水平有限,翻译中的疏漏和错误在所难免,还望读者和同行不吝指正。
封面图
目录
- 译者序
- 序
- 前言
- 致谢
- 作者简介
- 第1章 为什么需要CUDA1
- 1.1 本章目标2
- 1.2 并行处理的历史2
- 1.3 GPU计算的崛起3
- 1.4 CUDA5
- 1.5 CUDA的应用6
- 1.6 本章小结8
- 第2章 入门9
- 2.1 本章目标10
- 2.2 开发环境10
- 2.3 本章小结14
- 第3章 CUDA C简介15
- 3.1 本章目标16
- 3.2 第一个程序16
- 3.3 查询设备20
- 3.4 设备属性的使用23
- 3.5 本章小结24
- 第4章 CUDA C并行编程26
- 4.1 本章目标27
- 4.2 CUDA并行编程27
- 4.3 本章小结41
- 第5章 线程协作42
- 5.1 本章目标43
- 5.2 并行线程块的分解43
- 5.3 共享内存和同步54
- 5.4 本章小结68
- 第6章 常量内存与事件69
- 6.1 本章目标70
- 6.2 常量内存70
- 6.3 使用事件来测量性能78
- 6.4 本章小结83
- 第7章 纹理内存84
- 7.1 本章目标85
- 7.2 纹理内存简介85
- 7.3 热传导模拟86
- 7.4 本章小结101
- 第8章 图形互操作性102
- 8.1 本章目标103
- 8.2 图形互操作103
- 8.3 基于图形互操作性的GPU波纹示例108
- 8.4 基于图形互操作性的热传导113
- 8.5 DirectX互操作性118
- 8.6 本章小结118
- 第9章 原子性119
- 9.1 本章目标120
- 9.2 计算功能集120
- 9.3 原子操作简介122
- 9.4 计算直方图124
- 9.5 本章小结133
- 第10章 流134
- 10.1 本章目标135
- 10.2 页锁定主机内存135
- 10.3 CUDA流139
- 10.4 使用单个CUDA流140
- 10.5 使用多个CUDA流144
- 10.6 GPU的工作调度机制149
- 10.7 高效地使用多个CUDA流151
- 10.8 本章小结152
- 第11章 多GPU系统上的CUDA C154
- 11.1 本章目标155
- 11.2 零拷贝主机内存155
- 11.3 使用多个GPU162
- 11.4 可移动的固定内存166
- 11.5 本章小结170
- 第12章 后记171
- 12.1 本章目标172
- 12.2 CUDA工具172
- 12.3 参考资料176
- 12.4 代码资源178
- 12.5 本章小结179
- 附录 高级原子操作180