序言
过去二十年间,计算机芯片设计、制造技术不断创新,以x86为代表的微处理器性能以令人目眩
的速度不断提升。2000年之后,高性能微处理器逐渐以多核为发展方向。这是一个微妙的变化,暗示
着并行化成为提高性能的主要手段。
作为专用的图形协处理器,GPU的历史相比CPU短得多,但其晶体管数量增长和性能提升曲线
比CPU还要陡峭。从单位面积和单位功耗的角度衡量,现代GPU的计算能力已经大大超过CPU。这主
要得益于GPU的并行化本质:GPU芯片中有几百甚至更多数量的物理计算单元。
如今,市场上随处可以买到高性能的CPU和GPU,两者的并行处理能力足以构建一个桌面超级计
算机,前提是如何把芯片中的计算能力释放出来。并行化的核心问题是软件。由于GPU在指令集上和
x86处理器不兼容,这个问题显得尤为突出。
为了发挥GPU强大的计算能力,学术界开展了十余年的研究工作,尝试在GPU上实现非图形算
法。这些工作被统称为GPGPU。早期需要把其他应用中的算法映射到图形算法,再使用DirectX或者
OpenGL这样的图形编程接口来实现代码。随着时间推移和研发工作不断取得成果,厂商开始为用户
提供更加高效、直观的开发平台,于是有了CAL、Brook+、CUDA等等编程工具。这些方案大大提高了
开发效率,使得更多的开发人员很容易地在GPU平台上编程。另一方面,各个厂商专有解决方案之间
的不兼容性也给用户带来新的困扰。
OpenCL标准的制订和发布是对上述问题的回应,所有重要厂商都承诺为用户提供一个互相开
放、兼容、高效、易用的开发平台。兼得鱼和熊掌。
OpenCL的范畴远比GPU要大,覆盖了多种处理器芯片。从AMD的角度,这是一个跨越CPU和
GPU的编程接口,帮助开发者挖掘出系统所有的计算能力。中国首台千万亿次超级计算机“天河一
号”就是混合CPU和GPU的异构系统。
2008和2009年,AMD在全国高校范围成功举办了两届GPU加速计算竞赛,各种富有创意的算法
在AMD GPU上得到实现和性能验证。从2010年开始,竞赛的开发环境将全面升级到OpenCL。
本书最初是作为公司内外部OpenCL课程的讲义,严肃的程序员会在书中发现许多未充分展开的
论题。就像书名所暗示的,对于读者,我们希望保留简洁和易于上手的印象。
在出版物中每每可以见到并诧异于长长的感谢名单,当我们自己也终于完成了面前这本薄薄的
小册子时,才体会到作者的致谢并非泛泛而谈,确是肺腑之言。
感谢组内同事一年来的辛勤工作并将一路心得汇成此书;感谢A MD美国开发团队的Michael
Houston、Benedict Gaster、Micah Villmow、Elizabeth Sanville、Ben Sander等在技术上给予的指导和帮
助;感谢AMD大学项目部的Gloria Le组织GPU竞赛。
感谢AMD美国总部的Rick Bergman、David Wang、Raja Koduri,感谢AMD大中华区的Karen
Guo、Owen Liu,感谢AMD大中华区上海研发中心的Allen Lee、Wen-Chung Chen,他(她)们对通用计
算项目的支持使得这一切成为可能。
是为序。
李约炯
代表超威半导体(上海)有限公司
流计算小组
2010年3月
目录
第一章 GPU计算与OpenCL
1.1 什么是OpenCL ........................................................................................................ 1
1.2 为什么要使用OpenCL ........................................................................................... 1
1.2.1 利用OpenCL可以充分利用设备的并行特性 ......................................... 1
1.2.2 OpenCL为程序员提供了平台独立性 ...................................................... 2
1.3 AMD与流计算 ....................................................................................................... 3
1.4 本文的结构 .............................................................................................................. 4
第二章 OpenCL架构
2.1 平台模型PlatformModel ......................................................................................... 5
2.2 内存模型MemoryModel ......................................................................................... 6
2.3 执行模型ExecutionModel ...................................................................................... 7
2.4 编程模型ProgrammingModel ............................................................................... 9
第三章 OpenCL编程
3 .1 HelloOpenCL .......................................................................................................... 11
3 .2 OpenCL平台初始化 ............................................................................................... 19
3 .3 OpenCL运行时模块 .............................................................................................. 21
3 .4 OpenCL内存管理模块 .......................................................................................... 27
3 .5 OpenCL内核模块 ................................................................................................... 33
3 .6 OpenCL的可选扩展 ............................................................................................... 44
第四章 OpenCL优化编程
4.1 AMD GPU架构 ....................................................................................................... 47
4.2 基本优化策略 .......................................................................................................... 47
4.3 数据传输优化 .......................................................................................................... 48
4.4 内存访问的优化技术 ................................................................................................... 49
4.4.1 Global Memory访存......................................................................................... 49
4.4.2 Local Memory访存 .............................................................................. ........... 52
4.5 计算及控制流优化 ....................................................................................................... 58
4.5.1 控制流................................................................................................................ 58
4.6 其他优化技术 ............................................................................................................... 59
4.6.1 内建数学函数 ................................................................................................... 59
第五章 实例之一: MIR-FHD和MIR-Q的优化
5.1 MIR-FHD和MIR-Q的优化 ....................................................................................... 61
第六章 实例之二: KD-Tree创建算法并行化
6.1 KD-Tree简介 ................................................................................................................. 69
6.2 KD-Tree的创建算法改进 ........................................................................................... 69
6.3 并行创建KD-Tree算法细节 ....................................................................................... 73
6.3.1 求元素的包围集合........................................................................................... 73
6.3.2 元素的空间分割策略 ...................................................................................... 74
6.3.3 KD-Tree节点的内存管理 ............................................................................... 75
6.4 利用OpenCL所能带来的潜在优势 ........................................................................... 75
6.5 本章小结........................................................................................................................ 76
第七章 实例之三: 稀疏矩阵 -向量乘法(SpMV)
7.1 相关的基本概念............................................................................................................ 77
7.1.1 稀疏矩阵 ............................................................................................................ 77
7.1.2 稀疏矩阵的CSR格式 ....................................................................................... 78
7.2 SpMV算法设计和优化 ................................................................................................ 79
7.2.1 SpMV基本算法及其并行化 .......................................................................... 79
7.2.2 基本并行算法的优化 ...................................................................................... 80
7.2.3 进一步改进的方法 .......................................................................................... 8 2
7.3 本章小结 ........................................................................................................................ 86