基本信息
- 原书名:OpenCL Programming Guide
- 原出版社: Addison-Wesley Professional
- 作者: (美)Aaftab Munshi Benedict R.Gaster Timothy G.Mattson James Fung Dan Ginsburg
- 译者: 苏金国 李璜 杨健康
- 出版社:机械工业出版社
- ISBN:9787111398493
- 上架时间:2013-5-20
- 出版日期:2013 年1月
- 开本:16开
- 页码:404
- 版次:1-1
- 所属分类:计算机 > 图形图像、多媒体、网页制作 > OpenGL
计算机 > 软件与程序设计 > 综合 > 高级程序语言设计

编辑推荐
OpenCL核心设计人员亲自执笔,全面而深刻地解读了OpenCL规范和编程模型,公认的OpenCL权威著作!
注重实践,通过大量案例和代码演示了基于OpenCL编写并行程序和实现各种并行算法的原理、方法、流程及最佳实践!
内容简介
计算机书籍
OpenCL领域公认的权威著作,由OpenCL核心设计人员亲自执笔,不仅全面而深刻地解读了OpenCL规范和编程模型,而且通过大量案例和代码演示了基于OpenCL编写并行程序和实现各种并行算法的原理、方法、流程和最佳实践,以及如何对OpenCL进行性能优化,如何对硬件进行探测和调整。
《OpenCL编程指南》分为两大部分:第一部分(1~13章),从介绍OpenCL的核心思想和编写OpenCL程序的基础知识开始,对枯燥的OpenCL规范进行了深刻而系统的解读,旨在帮助读者全面、正确地理解OpenCL规范及其编程模型;第二部分(14~22章),提供了一系列经典的案例,如图像直方图、Sobel边界检测过滤器、并行实现Dijkstra单源最短路径图算法、Bullet Physics SDK中的布模拟、用快速傅里叶变换模拟海洋、光流、OpenCL与PyOpenCL结合使用,使用OpenCL完成矩阵相乘与稀疏矩阵矢量乘法等,目的是让读者通过案例熟练掌握编写复杂并行程序的方法和技巧。本书的附录收录了OpenCL规范定义的大量函数、命名常量和类型,可供程序员开发时查阅。
作译者
Benedict R.Gaster,资深软件架构师,他的主要工作是为下一代异构处理器开发编程模型,具体工作是在包含CPU和加速器的新兴处理器(如GPU)上探索并行编程的高层抽象。他为OpenCL的设计做出了巨大贡献,在Khronos Group开放标准协会中他是AMD的代表。由于他在可扩展记录和变量的类型系统方面成绩卓著,因而获得了计算机科学的博士学位。
TimothyG.Mattson,资深并行编程专家,从20世纪80年代中期开始从事相关工作,一直持续到现在。在此期间,他使用过各种类型的并行计算机(矢量超级计算机、SMP、VLIW、NUMA、MPP、集群和多核处理器)。1993年加入Intel公司,专注于OpenCL相关技术的研究。他还是一位资深的技术作家,参与撰写了《Patterns for Parallel Programming》、《An Introductionto Concurrency in Programming Languages》等经典著作。他因自己在分子分散理论方面的工作获得化学博士学位。
James Fung,NVIDIA资深技术工程师,专注于图形硬件上的计算机视觉和图像处理的研究,已经从图形发展到通用计算,经验十分丰富。拥有多伦多大学的电子与计算机工程博士学位,在并行GPU计算机视觉和介导现实领域发表过多篇IEEE和ACM论文。
Dan Ginsburg,资深OpenGL和OpenCL专家,曾经在AMDT.作8年,是AMD技术部的高级成员,承担过多种工作,包括开发OpenGL驱动程序、创建桌面和手持3D演示应用,以及领导手持GPU开发工具的开发。他还曾在Still River Systems工作,为Monarch 250质子束放射线治疗系统开发GPU加速图像注册软件。目前在Boston儿童医院的新生儿神经影像和开发科学中心担任首席软件架构师,致力于使用OpenCL来提高神经影像算法的速度。他拥有Worcester Polytechnic学院的计算机科学学士学位和Bentley大学的MBA学位。
目录
译者序
序
前言
致谢
第一部分 OpenCL 1.1语言与API
第1章 OpenCL介绍2
1.1 什么是OpenCL,或者为什么需要这本书2
1.2 多核的未来:异构平台2
1.3 多核世界中的软件4
1.4 OpenCL的概念基础7
1.4.1 平台模型7
1.4.2 执行模型8
1.4.3 内存模型13
1.4.4 编程模型15
1.5 OpenCL与图形18
1.6 OpenCL的内容19
1.6.1 平台API19
1.6.2 运行时API20
1.6.3 内核编程语言20
译者序
OpenCL 1.0规范在2008年12月浮出水面。OpenCL是Open Computing Language(开放计算语言)的缩写。设立OpenCL的目的就是为日益庞大的并行计算市场提供一个开放的、免费的行业标准。它让开发人员能够利用CPU、GPU等计算设备内部巨大的并行计算能力。OpenCL不仅得到了Apple等诸多大公司的支持,而且目前宣称支持OpenCL并参与其中的成员几乎涵盖了全球主要的处理器、计算芯片供应商,这一切要归功于OpenCL的开放、高度通用的设计原则。为了保证通用计算,OpenCL在五个方面进行了规定:系统调用全部的硬件资源;将C语言作为并行程序模型的基础,加快OpenCL程序的研发速度以及保证可移植性;做到与现有软件体系结构通用;实现硬件平台上的通用;提供承前启后,向前兼容的通用支持。
尽管大多数人对OpenCL的并行计算和数据处理领域的突出地位有所了解,但对如何利用OpenCL规范编写复杂的并行程序还是一头雾水,不知如何下手。特别是,尽管OpenCL规范很全面,但从诸多繁杂的细节中找出直接需要的东西并不容易,这也让很多有心加入OpenCL编程队伍的人望而却步。
不过,本书为OpenCL世界带来了福音。本书出自资深程序员之手,正是程序员需要的实用指南。本书第一部分介绍了OpenCL 1.1规范的全部内容,包括OpenCL的基本核心思想以及编写OpenCL程序的基础知识。第二部分给出了大量实际用例,可以从中了解OpenCL的各个方面在复杂应用中如何工作,学习如何在实际项目中使用OpenCL。
正如作者们所说,“我们正处在一场计算变革当中,正如当年PC的出现。更准确地说,我们很有可能要迎接一场革命,因为如果没有并行软件,异构硬件提供的高度并行性就毫无意义。但事实上,在特定的小环境之外,并行软件相当稀缺”,所以“加入我们的行列吧”!读完本书,相信你能编写出可以合理分配计算负载的复杂并行程序,充分利用OpenCL实现性能优化。
本书由苏金国、李璜、杨健康主译,乔会东、仝磊、王少轩、程芳、宋旭民、黄小钰分别对全书各章进行审阅。另外,姚曜、程龙、吴忠望、张练达、陈峰、江健、姚勇、卢釜、张莹参与了全书的修改整理,林琪、刘亮、刘跃邦、高强和王志淋统一了全书术语,并完善了关键部分的翻译。全体人员共同完成了本书的翻译工作。不过由于水平有限,译文肯定有不当之处,敬请批评指正。
前言
不过,在过去的十年间,确实发生了一些革命性的变化。多核CPU的出现使得并行硬件无处不在。GPU不再只是专用的图形处理器,它们也成为重量级的计算引擎。另外,CPU和GPU的组合(也就是一般所称的异构平台)确实重新定义了计算的标准构成模块。
我们正处在一场计算变革当中,正如当年PC的出现。更准确地说,我们很有可能要迎接一场革命,因为如果没有并行软件,异构硬件提供的高度并行性毫无意义。事实上,在特定的小环境之外,并行软件相当稀缺。
为了与正在发生的(并行)异构计算变革同步,发动一场并行软件的革命,我们需要一个并行软件行业。不过,只有软件能够在平台之间迁移,既要保证跨开发商,也要保证跨代,这个行业才能发展壮大。解决之道就是建立异构计算的一个行业标准。
OpenCL正是这样一个行业标准。OpenCL由Khronos Group(因OpenGL和其他标准而闻名)创建,最初萌生于软件开发商、计算机系统没计者(包括移动平台设计者)和微处理器(包括嵌入式处理器、加速器、CPU和GPU)制造商的一次合作。对于人们提出的问题:“在异构平台上编程时,如何保证现在创建的软件将来仍有效”,OpenCL给出了答案。
OpenCL诞生于2008年,如今可在多种平台上由多个来源得到。它一直在稳步发展,以保持与最新的微处理器同步发展。在本书中我们将重点介绍OpenCL 1.1,全面介绍这个标准,并给出丰富的例子解释OpenCL在实际中的使用。
本书读者对象
本书出自程序员之手,同时面向程序员。对于要编写代码的人来说,这是一本非常注重实效的指南。我们认为读者已经了解C和C++(书中的某些部分要求有C++基础)。最后,我们还假设读者已经熟悉并行编程的基本概念。我们相信读者手边有一台计算机,可以编写软件,研究在书中学到的新知识。因此,本书提供了大量程序和代码段。
我们会全面介绍OpenCL 1.1规范,并解释如何实现大量并行算法。学完本书后,你将能够编写复杂的并行程序,将工作负载分散到异构平台的多个设备上。你还将掌握OpenCL中性能优化的基础,了解如何编写软件,从而探查硬件,并相应地做出调整以得到最优性能。
本书组织结构
OpenCL规范大约有400页。这是一份晦涩、复杂的文档,其中满是乏味的具体细节。要想解释这个规范可不是件容易的事情,不过我们认为本书很好地做到了这一点。
本书分为两部分。第一部分描述OpenCL规范。前两章介绍OpenCL的基本核心思想以及编写OpenCL程序的基础知识。然后开始系统地研究OpenCL 1.1规范。通过结合参考材料,并给出解释说明,使本书的风格有所改变。第二部分提供了一系列案例研究。通过这些简单的示例,可以了解OpenCL的各个方面在复杂应用中的工作方式,从而展示如何在正式的应用项目中使用OpenCL。下面给出更详细的介绍,帮助你了解本书。
第一部分:OpenCL 1.1语言与API
第1章:这一章高度概括了OpenCL。首先详细解释了为什么在可预见的将来异构并行平台将主宰计算领域,然后描述了OpenCL的核心模型和概念。在这个过程中,还将给出OpenCL中使用的术语,因此,即使你只打算快速浏览本书,把它作为一个OpenCL参考指南,这一章也很重要。
第2章:真正的程序员要通过编写代码来学习。因此,作为对OpenCL介绍的补充,我们专门用一章来研究一个实际的OpenCL程序。通常在介绍一种编程语言时,首先会给出一个例子,在屏幕上输出“hello world”,这似乎已经成为一个惯例。但在OpenCL中,这是没有意义的(OpenCL根本没有输出语句)。在数据并行编程领域,与“hello world”对应的是另外一个简单程序:让两个数组逐元素相加。这个程序将作为这一章的核心。在这一章的最后,你会充分了解OpenCL,可以开始编写简单程序。我们强烈建议你立即着手编写自己的程序。只看书不动手编程,是无法学会一种编程语言的。动手写代码吧。
第3章:从这一章开始,将系统研究OpenCL规范。要让OpenCL程序做些“有意思”的事情,首先需要找到可用的资源,然后准备好做有用的工作。换句话说,程序必须发现平台,为OpenCL程序定义上下文,并确定如何使用这些设备。这些重要内容都将在这一章介绍,并详细描述OpenCL平台APl。
第4章:在OpenCL设备上运行的代码大多数情况下都使用OpenCLC编程语言来编写。在一个C99子集基础上,OpenCL C编程语言提供了内核有效利用OpenCL设备所需的支持,其中包括一组丰富的矢量指令。这一章将详细解释这种编程语言。
第5章:OpenCL C编程语言API定义了一个庞大且复杂的内置函数集,将在这一章介绍。
第6章:了解了用来编写内核的语言之后,接下来转向OpenCL定义的运行时API。首先介绍程序和内核的过程。要记住,OpenCL中程序一词有新的含义。在OpenCL中,程序专门指“动态库”,内核可以从中获取函数。
第7章:这一章介绍缓冲区内存对象(1维数组),还会详细讨论子缓冲区。子缓冲区是OpenCL 1.1中新增的一个特性,因此有OpenCL 1.0经验的程序员会发现这一章尤其有用。
序言
GPU等多核处理器的出现引发了这场革命。例如,现在可以购买一块每秒执行上万亿次浮点操作(teraflops)的图形卡。这些GPU专门设计用来渲染酷炫的图像,不过如果工作负载合适,这些GPU也可以用做高性能的计算引擎,来完成从科学计算到增强现实等一系列应用。
人们很自然地提出一个问题:与传统的单核CPU相比,这些多核处理器为什么速度如此之快。最根本的驱动力来自创新的并行硬件。之所以并行计算比串行计算更为高效,是因为芯片本质上是并行的。现代芯片包含数十亿个晶体管。多核处理器将这些晶体管组织为多个并行处理器,分别由数百个浮点单元组成。多核处理器的速度提升还有一个重要的原因,这就是新的并行软件。要充分利用所有这些计算资源,就要求我们开发并行程序。由于软件和硬件带来的效率提升,使我们能够得到比单核CPU更大的每瓦特或每美元FLOP数。
计算系统由硬件和软件共同组成。如果没有好的编程模型,硬件就没有多大用处。CPU的成功要归结于其编程模型的成功,具体体现为C语言及其后续语言。C语言很好地抽象了一个串行计算机。要充分利用异构计算机,我们需要新的编程模型能够很好地抽象一个现代并行计算机。可以参考图形领域成熟的技术,帮助建立异构计算所需要的新的编程模型。
多年来,我一直对图形的编程模型很感兴趣,最早可以追溯到1988年。那时我是PIXAR的一名软件工程师,开发了一种RenderMan着色语言。十年后图形系统已经变得足够快,可以考虑为GPU开发着色语言了。通过与Kekoa Proudfoot和Bill Mark合作,我们开发了一种实时着色语言RTSL。RTSL在图形硬件上运行,可以将着色语言程序编译为像素着色程序(这是当今面向图形硬件的汇编语言)。后来BillMark加入了NVIDIA,在那里开发了Cs。最近,我与Tim Foley同在Intel工作,他开发了一种名为Spark的新的着色语言。Spark将着色语言提高到一个新的层次,可以抽象能提供镶嵌等新功能的复杂图像管线。
在开发这些语言时,我很清楚GPU不仅仅可以用于处理图形数据。很多组织已经通过实验证明了图形硬件还可以用于图形以外的其他应用。这就催生了通用GPU(General—Purpose GPU,GPGPU)运动。通过使用图形库,对之前的展示实例进行调整。为了让GPU得到更广泛的使用,需要一个并不限定于图形的更通用的编程环境。为了满足这个需要,我们在斯坦福大学启动了针对GPU的Brook项目。Brook的基本思想是把GPU当做一个数据并行处理器。数据并行编程方法对于完成并行计算极为成功,通过Brook,我们能够展示在GPU上实现数据并行编程原语。Brook允许开发人员采用一种广泛使用的并行编程模型编写应用程序。
Brook主要是一个概念验证项目。斯坦福大学的一名研究生lanBuck后来加入NVIDIA开发CUDA。CUDA在很多重要方面延伸了Brook。它引入了合作线程数组的概念,即线程块(thread block)。合作线程数组可以描述GPU核的局部性,执行相同程序的一组线程可以通过局部内存通信,并通过栅栏同步。更重要的是,CUDA为GPU Computing创建了环境,已经得到大量应用开发人员、中间件提供商和开发商的参与。
开放计算语言(Open Computing Language,OpenCL)将GPU Computing的核心思想进一步延伸,带来了普适异构并行计算的新纪元。OpenCL由Khronos Group精心设计,并得到很多开发商和软件专家的支持。人们使用CUDA创建一个可以由多个开发商实现的软件标准时获得了很多经验,OpenCL的开发也得益于这些经验。现在OpenCL实现可以在广泛使用的硬件上运行,包括NVIDIA、AMD和Intel的CPU与GPU,还可以在基于DSP和FPGA的平台上运行。通过标准化编程模型,开发人员可以使用更多软件工具和硬件平台。
关于OpenCL最令人兴奋的是,它不仅对已经完成的工作进行标准化,而且表现出一个积极群体正在为推进并行计算所投入的热情和努力。例如,OpenCL提供了在GPU上调度任务的创新功能。另外,OpenCL开发人员已经结合了任务并行和数据并行计算的最佳特性。希望OpenCL将来的版本有同样的创新性。与其前身OpenGL一样,OpenCL会在今后一段时间继续发展,开发出能提供更多功能的新版本。
本书介绍了完整的OpenCL编程模型。合作者之一Aaftab是这个系统的灵魂人物。在他的号召之下,多位OpenCL核心设计人员加入,从而编写了这本容易理解的权威指南。欢迎来到异构计算的新世界。
———Pat Hanrahan
斯坦福大学教授
媒体评论
——Pat Hanrahan,斯坦福大学教授
书摘
第1章OpenCL介绍
第2章HelloWorld:一个OpenCL例子
第3章平台、上下文和设备
第4章OpenCL C编程
第5章OpenCL C内置函数
第6章程序与内核
第7章缓冲区和子缓冲区
第8章图像和采样器
第9章事件
第10章与OpenGL的互操作
第11章与Direct3D的互操作
第12章C++包装器API
第13章OpenCL嵌入式简档
第一部分OpenCL 1.1语言与API
第1章OpenCL介绍
第1章OpenCL介绍
学习一种新的编程模型时,很容易迷失在繁杂的细节当中。总会有API和奇怪的新术语突然冒出来,这些新术语不仅增加了不必要的复杂性,而且特别容易混淆。关键是要从高层上有清楚的认识,这样可以提供一个路线图,在遇到困难时可以从中找到合适的解决方法。
本章的目的就是帮助你建立这个路线图。首先,概述了OpenCL 1.1规范,并简要介绍了异构计算趋势,正是这一趋势促使OpenCL成为如此重要的一个编程标准。其次,描述OpenCL的底层概念模型,并用这些模型来解释OpenCL如何工作。此时,我们已经建立了OpenCL的理论基础,然后考虑OpenCL的组成。其中很关键的一个部分是OpenCL与图形标准的关系。最后,在这个OpenCL路线图中,我们会简要地介绍OpenCL标准与嵌入式处理器的关系。
1.1什么是OpenCL,或者为什么需要这本书