OpenCL异构并行计算:原理、机制与优化实践
上QQ阅读APP看书,第一时间看更新

前言

为什么要写这本书

2007年NVIDIA发布CUDA,正式开启了利用GPU作为大规模数据并行计算的时代。而最近几年GPU计算已经完成了从实验室、研究所的研究对象到产业界提高生产力的实际工具的转变。但是NVIDIA的CUDA并没有得到其他厂商支持,CUDA代码并不能在其他硬件厂商的产品上运行,而在实际中,用户更希望代码能够同时在多个平台上运行,以减少编码和优化代价。

2008年,在苹果公司将自己撰写的OpenCL草案开放给Khronos Group(开放标准组织)之后,Khronos Group在6个月的时间内发布了OpenCL 1.0标准。这不仅引起了像Intel、NVIDIA、AMD这类传统CPU和GPU处理器厂商的关注,而且还吸引了像TI这类做DSP的公司,以及Altera这类做FPGA的公司。因为OpenCL将基于GPU的高性能计算概念做了更广范的延展,从NVIDIA扩展到几乎所有的硬件厂商,从GPU扩展到CPU、DSP和FPGA等,从高性能计算集群扩展到云、桌面和移动,我们称之为异构并行计算,而GPU计算是异构并行计算的一种。

目前,即便是CPU也能通过OpenCL实现其内部的SIMD操作,从而能达到更快速的数据处理。程序员通过OpenCL这样的编程工具就能达到加速原来数据密集型代码的目的,而无须过多关注底层的硬件特性(如指令集架构等)。OpenCL给程序员带来了标准、统一的接口来实现任务级并行以及数据级并行的算法处理。

由于目前OpenCL编程环境最为成熟的还是AMD的APP和NVIDIA的CUDA,因此本书主要基于AMD APP和NVIDIA的CUDA编程环境描述,考虑到移动端对OpenCL的支持也越来越多,尤其是ARM的Mali GPU已经引入了广泛的OpenCL支持,因此本书会简略介绍OpenCL在Mali GPU上的编程和优化。

由于OpenCL标准本身阅读起来比较晦涩,很多概念也没有完全解释清楚,因此我们写这本书的目的是以更简洁、通俗的语句来表达OpenCL中的各种概念,以及各种API、各种语法的使用,使读者更易理解。同时加入了很多代码示例以及图表以进一步帮助读者加深对这些概念的理解。另外,在写这本书的时候OpenCL 2.0标准已经发布将近1年了,我们这本书也以最新的OpenCL 2.0标准为主,给读者呈现当前最先进的OpenCL技术。本书对OpenCL 2.0中所新引入的SVM机制、管道、原子操作等概念有着非常深入的描述,并且结合大量示例进行剖析。

读者对象

由于移动处理器和GPU已经非常便宜,而异构并行计算是未来的趋势,所有IT行业的从业者都应当收藏、阅读本书,以增加对OpenCL的了解。笔者认为下列人员更应当阅读本书:

‰互联网及传统行业的IT从业者;

‰希望将应用移植到移动处理器或GPU的开发人员;

‰对向量化和并行化感兴趣的职业工作者;

‰大中专院校、研究所的学生及教授。

如何阅读本书

本书大致的目录结构如下:

第1章主要介绍并行计算的发展历程以及OpenCL在其中所扮演的角色;

第2章和第3章介绍了OpenCL的大体概念以及它在主机端上API的功能和说明;

第4章和第5章主要描述OpenCL C语言的概念以及相关语法点;

第6章对OpenCL整个同步机制做了一个总结性的整体深入介绍,从主机端的事件同步到内核程序的原子操作,每一种同步方式都做了非常详细的介绍;

第7章详细描述了OpenCL与OpenGL之间的交互;

第8章介绍了当前OpenCL各大实现厂商对OpenCL的各自硬件实现,同时也讲解了各种不同硬件平台上如何有针对性地对OpenCL程序做进一步优化;

第9章和第10章通过几个实际例子为读者展示了OpenCL的优化实践以及在实际工程项目中的使用技巧。

阅读本书的读者应当对C编程语言有一定程度的理解,最好同时能熟悉基本的计算机体系结构方面的理论知识。当然,考虑到很多工程学、经济学等方面的专家对计算机相关的理论知识掌握有限,而且此类读者往往更偏向于OpenCL工具的运用,因此我们建议这类读者可以略过整个5.6节以及整个第8章。虽然本书尽可能通俗而又简洁地去介绍大部分OpenCL 2.0标准中所涉及的概念,但是很多概念没有一定基础仍然会比较难以理解,因此读者在遇到这样的概念时可以先实践,然后慢慢消化。

勘误和支持

由于笔者的水平有限、工作繁忙、编写时间仓促,而异构并行计算领域正在高速发展中,OpenCL的标准内容也越来越多,笔者虽已努力确认很多细节,但书中难免会出现一些不准确的地方甚至是错误,恳请读者批评指正。另外,由于我们目前手头上支持OpenCL 2.0标准的设备有限,本书中难免还会有一些错误、瑕疵。读者若发现一些明显的错误或者对我们书写的内容有任何疑问、建议,欢迎与我们一同讨论。我们的联系方式为:ly152832912@163.com。

书中有些完整的工程代码可在以下地址下载:www.hzbook.com。

致谢

本书能够出版不仅仅出自我们自己对OpenCL的热情和执着,在这里我们还要感谢机械工业出版社华章公司高婧雅对我们的大力支持,没有她,我们也不会想到要编写此书。

感谢赵成龙(网名龙猫)认真帮我们审查草案,以及对草案细节的校正。在此书成书的过程中,如果没有赵成龙的无私帮助,本书可能会晚半年出版。

感谢AMD大中华区软件合作及解决方案高级经理时昕对整本书的审阅,时总不但名字与时俱进,技术能力也与时俱进,有点让我们这些一线的程序员汗颜了;我们还要感谢AMD(中国)有限公司免费为我们提供实验设备。

感谢家人对我们写作的支持,感谢他们容忍了我们晚上加班回家后,还要在电脑前写作!

谨以此书献给我最爱的家人,以及众多热爱异构并行计算的朋友们!愿你们快乐地阅读本书!

风辰