前言
OpenCL实战
1997年的夏天,我被震惊了。除了能在自己的专业(微电子工程)做实习生,我所能找到的最好的工作就是在一个专门研究高速信号处理的实验室做事,负责用C和MPI(Message Passing Interface,消息传递接口)编程实现二维快速傅里叶变换(fast Fourier transform,FFT)。好消息是这个实验室有16台新的SPARC计算机,坏消息是我对MPI和FFT一无所知。
在当时还是新奇古怪的Amazon.com上,我购买了一些相关书籍,然后才费力弄清楚MPI的基本处理过程:应用程序将一系列指令部署到多台计算机上,每台计算机根据它的ID访问数据。在每台处理器完成相应的任务之后,将结果返回给ID为0的处理器。
又过了些日子,我才对MPI有了更进一步的认识(阻塞和非阻塞数据传输,同步和异步通信)。在编程学习过程中,我发现自己爱上了分布式计算。我喜欢16台庞然大物锁步处理数据,它们就像是同场竞赛的运动员。我感觉自己就像是一名编舞,悉心策划一出精彩的舞蹈演出,亦或是一名作曲家,为整个乐团创作交响乐。实习结束时,我已经能用MPI编写出多个版本的二维快速傅里叶变换了,但最后因为网络延时的关系,实验室的研究人员否决了这个不太可行的方案。
那个暑假之后,我就对高性能计算倾注了极大的热情,全心投身于数字信号处理器、FPGA(Field-Programmable Gate Arrays,现场可编程门阵列)以及Cell处理器(它可是Sony PS3的“大脑”)的应用之中。但我想说的是,所有这些都不能够替代用OpenCL对GPU(Graphics Processing Unit,图像处理单元)的编程体验。现在的超级计算机设计也已经说明,没有哪块CPU可以提供和GPU相并论的“计算处理能力/功耗”的性能。同时,也没有哪门语言能够像OpenCL一样,得到如此广泛的设备支持。
当AMD在2009年发布它的OpenCL开发工具时,我就已经爱上了OpenCL。不仅仅是因为OpenCL能提供新的数据类型(向量数据类型)以及众多的数学函数,还因为它在很多方面都和MPI很像。两个工具集都免费、开源,也都可以用C或C++来编写应用程序。同时,应用程序也都是将指令发送到多个设备上,其中处理单元根据ID来确定访问相应的数据。MPI和OpenCL也都允许使用相似的阻塞/非阻塞传输和同步/异步通信来进行数据传输。
OpenCL在高性能计算领域还很新,也许很多程序员都还不知道它的存在。因此,为了帮助扩大这门语言的影响,我决定编写OpenCL in Action这本书。我很享受写书的过程,也希望它能帮助初学者了解、认识OpenCL和分布式计算。
在2011年的夏天,我开始写作此书的时候,我不禁有种周而复始的感觉。昨天晚上,我将本书收官在第14章的FFT应用程序上。它让我回想起了和MPI打交道的日子,但我还是惊讶于这些年的技术变迁。1997年,我实验里的16台SPARC机器花了将近1分钟的时间才完成32k FFT的运算。而到了2011年,300美元的显卡就能在几秒之内完成上百万个数据点的FFT变换。
技术在变化,但是编程的乐趣不变。也许现如今,分布式计算的学习曲线越来越陡,但回报的甘饴,而非补偿,也胜过以往。
目 录
前言
关于本书
致谢
第一部分 OpenCL编程基础
第1章 OpenCL简介
1.1节 OpenCL的来临
1.2节 为什么是OpenCL
1.3节 类比:OpenCL处理和纸牌游戏
1.4节 OpenCL应用程序的第一印象
1.5节 OpenCL标准和扩展
1.6节 框架和SDK
第2章 主机编程:基本的数据结构
第3章 主机编程:数据传输和数据划分
第4章 内核编程:数据类型和设备内存
第5章 内核编程:运算符和函数
第6章 图像处理
第7章 事件、性能分析及同步化
第8章 用C++开发
第9章 用Java和Python来开发
第10章 通用编程原则
第二部分 用OpenCL来编程实现实际的算法
第11章 归并与排序
第12章 矩阵和QR分解
第13章 稀疏矩阵
第14章 信号处理和快速傅里叶变换
第三部分 用OpenCL来加速OpenGL
第15章 将OpenCL和OpenGL结合
第16章 纹理和渲染缓存
附录A 安装和使用软件开发包
附录B 用OpenGL作实时渲染
附录C 面向Windows和OpenCL的最简GNU
附录D Appendix D移动设备上的OpenCL