首页>参考读物>计算机科学与技术>软件与程序设计

OpenCL编程指南
作者 : (美)Aaftab Munshi,Benedict R. Gaster, Timothy G. Mattson, James Fung, Dan Ginsburg 著
译者 : 苏金国 李璜 杨健康 等译
出版日期 : 2012-11-13
ISBN : 978-7-111-39849-3
定价 : 89.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 424
开本 : 16
原书名 : OpenCL Programming Guide
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书涵盖了全部的规范。该书分析了主要的使用案例,说明了OpenCL如何表示大范围的并行算法,给API和OpenCL编程语言提供了完整的参考资料。
通过完整的案例学习和可下载的代码实例,作者说明了如何编写复杂的并行程序,将工作负荷分解到许多不同的设备上。作者还介绍了OpenCL 软件性能优化的所有要件,包括对硬件的探测和自适应。
主要内容包括:介绍了OpenCL的核心模式,概念,术语,目标和基本理论;发现和准备可用资源;使用OpenCL C、内置函数和运行时API编程;使用缓冲区、辅助缓冲区、图像、采样器和事件;与OpenGL和微软的Direct3D的数据共享和同步;使用C++ Wrapper API简化开发过程;使用OpenCL的嵌入式规格,支持从手机到超级计算机节点设备;建立完整的应用:图像直方图,边缘检测滤波器,物理模拟,快速傅立叶变换,光流等;与PyOpenCL一起使用 OpenCL,包括从C++到Python的移植问题;执行矩阵乘法和高性能的稀疏矩阵乘法。

图书特色

作者简介
Aaftab Munshi
OpenCL核心设计小组的灵魂人物之一,同时他也是OpenCL、OpenGL ES 1.1、OpenGL ES 2.0规范的编辑,与Dan Ginsburg和Dave Shreiner合著了《OpenGL ES 2.0 Programming Guide》。目前他任职于Apple公司。

Benedict R. Gaster
资深软件架构师,他的主要工作是为下一代异构处理器开发编程模型,具体工作是在包含CPU和加速器的新兴处理器(如GPU)上探索并行编程的高层抽象。他为OpenCL的设计做出了巨大贡献,在Khronos Group开放标准协会中他是AMD的代表。由于他在可扩展记录和变量的类型系统方面成绩卓著,因而获得了计算机科学的博士学位。

Timothy G. Mattson
资深并行编程专家,从20世纪80年代中期开始从事相关工作,一直持续到现在。在此期间,他使用过各种类型的并行计算机(矢量超级计算机、SMP、VLIW、NUMA、MPP、集群和多核处理器)。1993年加入Intel公司,专注于OpenCL相关技术的研究。他还是一位资深的技术作家,参与撰写了《Patterns for Parallel Programming》、《An Introduction to Concurrency in Programming Languages》等经典著作。他因自己在分子分散理论方面的工作获得化学博士学位。

James Fung
NVIDIA资深技术工程师,专注于图形硬件上的计算机视觉和图像处理的研究,已经从图形发展到通用计算,经验十分丰富。拥有多伦多大学的电子与计算机工程博士学位,在并行GPU计算机视觉和介导现实领域发表过多篇IEEE和ACM论文。

Dan Ginsburg
资深OpenGL和OpenCL专家,曾经在AMD工作8年,是AMD技术部的高级成员,承担过多种工作,包括开发OpenGL驱动程序、创建桌面和手持3D演示应用,以及领导手持GPU开发工具的开发。他还曾在Still River Systems工作,为Monarch 250质子束放射线治疗系统开发GPU加速图像注册软件。目前在Boston儿童医院的新生儿神经影像和开发科学中心担任首席软件架构师,致力于使用OpenCL来提高神经影像算法的速度。他拥有Worcester Polytechnic学院的计算机科学学士学位和Bentley大学的MBA学位。

“欢迎来到异构并行编程的新世界,凭借这本通俗易懂的权威指南,你将深入了解完整的OpenCL编程模型。”
—— Pat Hanrahan,斯坦福大学教授


使用全新的OpenCL标准,可以编写能访问所有可用编程资源(如DSP和Cell/B.E.处理器)的应用程序,包括CPU、GPU和其他处理器。Apple、AMD、Intel、IBM、NVIDIA和其他业界巨头都已经实现了OpenCL标准,该标准在PC、服务器、手持/嵌入式设备、高性能计算,甚至云系统等诸多领域都潜力无限。这是OpenCL 领域第一本详尽而实用的权威指南,专门面向从事具体工作的开发人员和软件架构师。  
本书由五位OpenCL核心设计人员携手打造,不仅详细而完整地解读了枯燥的OpenCL规范,而且通过一些重要的案例展示了如何利用OpenCL实现大量并行算法、编写复杂的并行程序、对OpenCL进行性能优化,以及探查硬件和针对硬件进行调整,是系统学习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平台API。
  第4章:在OpenCL设备上运行的代码大多数情况下都使用OpenCL C编程语言来编写。在一个C99子集基础上,OpenCL C编程语言提供了内核有效利用OpenCL设备所需的支持,其中包括一组丰富的矢量指令。这一章将详细解释这种编程语言。
  第5章:OpenCL C编程语言API定义了一个庞大且复杂的内置函数集,将在这一章介绍。
  第6章:了解了用来编写内核的语言之后,接下来转向OpenCL定义的运行时API。首先介绍程序和内核的过程。要记住,OpenCL中程序一词有新的含义。在OpenCL中,程序专门指“动态库”,内核可以从中获取函数。
  第7章:这一章介绍缓冲区内存对象(1维数组),还会详细讨论子缓冲区。子缓冲区是OpenCL 1.1中新增的一个特性,因此有OpenCL 1.0经验的程序员会发现这一章尤其有用。
  第8章:这一章介绍另一个内存对象:图像——这是一个非常重要的内容。由于图形和OpenCL之间存在紧密的关系,因此这些内存对象对于很多OpenCL程序员来说都很重要。
  第9章:这一章将详细讨论OpenCL中的事件模型。这些对象用来强制OpenCL中的顺序约束。基本上,通过事件编写并发代码,不论运行时如何调度工作,都能生成正确的答案。不过,从算法的角度来讲,在更高层次上,事件可以支持程序指令作为跨多个设备的有向无环图。
  第10章:很多应用可能尝试使用图形API来显示OpenCL处理的结果,或者甚至使用OpenCL处理由图形生成的场景。OpenCL规范允许与OpenGL图形API互操作。这一章将讨论如何建立OpenGL/OpenCL共享,以及如何共享和同步数据。
  第11章:OpenCL应用常用于Microsoft系列平台。OpenCL应用包括图形时,可能需要连接到Microsoft的内置图形API。在OpenCL 1.1中,定义了如何将一个OpenCL应用连接到DirectX 10 API。这一章将介绍如何建立OpenCL/Direct3D共享,以及如何共享和同步数据。
  第12章:这一章讨论了OpenCL C++ API包装器。包装器可以大大简化用C++编写的宿主机程序、寻址自动引用计数,还提供了可以查询OpenCL对象信息的一个统一接口。一旦掌握了C++接口,可能就不想再使用常规的C接口了。
  第13章:OpenCL面向的设备种类繁多,从移动电话到庞大的并行超级计算机中的节点。OpenCL规范的大部分内容可以不加修改地应用于这些设备。不过,对于在嵌入式设备中使用的低功耗处理器,为适应其缩减的功能,需要对OpenCL做少量修改。这一章介绍了这些修改,在OpenCL规范中称为OpenCL嵌入式简档。
第二部分:OpenCL 1.1案例研究
  第14章:直方图可以报告数据集中值的出现频率。例如,在这一章中,我们计算了一个彩色图像的R、G、B通道值的直方图。要并行生成直方图,可以对数据集的局部区域计算值,再累加这些局部值生成最终结果。这一章有两个目标:1)展示在OpenCL中如何处理图像;2)研究在OpenCL程序中高效完成直方图全局累加的技术。
  第15章:Sobel边界过滤器是一个有向边界检测过滤器,会沿x轴和y轴计算图像梯度。在这一章中,介绍了使用一个内核应用Sobel边界过滤器的简单例子,展示了在OpenCL中内核如何处理图像。
  第16章:这一章提供了OpenCL中Dijkstra单源最短路径图算法的一个实现,可以充分利用CPU和多个GPU设备。图数据结构在很多问题中都得到了应用,从人工智能到神经影像。这个特定实现是作为FreeSurfer的一部分开发的,它是一个神经影像应用,目的是改善算法的性能,该算法要测量大脑皮层三角网格重构的曲率。这个例子可以很好地说明如何使用多个OpenCL设备,以及同时在CPU、多个GPU或者所有设备上划分工作负载。
  第17章:物理模拟是现代视频游戏的一个有力补充,目前还在不断发展中,这一章提供了使用OpenCL模拟布的一种方法(如战士的衣服),这是Bullet Physics SDK的一部分。模拟柔软物体有很多方法:Bullet中使用的模拟方法类似于一种质点/弹簧模型,并为在现代GPU上执行进行了优化,同时平滑地集成其他Bullet SDK组件(未采用OpenCL编写)。这里展示了一种重要的技术,称为分批,即转换粒子网格,从而在SIMD体系结构上高效执行(如GPU),同时保持质点/弹簧模型中的依赖关系。
  第18章:这一章详细介绍了AMD的Ocean(海洋)模拟。Ocean是一个OpenCL演示程序,使用了逆离散傅里叶变换来实时模拟海洋。快速傅里叶变换应用于随机噪声,作为频率依赖相移随时间生成。我们介绍了基于傅里叶变换方法完成的一个实现,这种方法最初由Jerry Tessendorf开发,已经用于很多故事片的特效处理,如《未来水世界》、《泰坦尼克号》和《第五元素》。这一章介绍了一个优化2D DFFT的开发,包括OpenCL编程中很多很有用的重要优化手段,还介绍如何将这个算法集成到应用当中,以及如何使用OpenCL和OpenGL的互操作性。
  第19章:这一章提供了用OpenCL完成的一个光流实现,这是计算机视觉领域的一个基本概念,用来描述图像中的运动。光流在图像稳定性、帧速率上采样有很多应用,还可以作为更高层算法的输入,如对象跟踪和手势识别。这一章给出了用OpenCL实现的金字塔Lucas-Kanade光流算法。这个实现展示了如何使用图像对象访问GPU硬件的纹理特性。我们还介绍如何使用GPU上的纹理过滤硬件完成数据的线性插值,从而得到所需的亚像素准确性,并相应地显著提升速度。另外,我们还讨论如何使用共享内存缓存反复访问数据,以及如何利用内核提前退出技术以提高效率。
  第20章:这一章的目的是介绍在Python中使用OpenCL的基本知识。本书主要强调通过C/C++使用OpenCL,不过为其他一些语言(如Python)也开发了OpenCL绑定。这一章将逐步介绍PyOpenCL,我们给出将第8章中的高斯图像过滤示例移植到Python所需要的各个步骤。除了说明从C++移植到Python所需要的修改外,这一章还讨论在诸如Python等动态类型语言中使用OpenCL的一些好处。
  第21章:这一章讨论了一个将两个方阵相乘的程序。这个程序很简单,因此很容易了解优化其性能时对程序所做的修改。这些优化主要强调OpenCL内存模型,以及如何使用这个模型尽可能减少OpenCL程序中数据移动的开销。
  第22章:这一章介绍了使用OpenCL完成稀疏矩阵矢量乘法的一个优化实现。稀疏矩阵定义为很大的2维矩阵,其中矩阵的大部分元素都等于0。很多领域中都使用了稀疏矩阵来描述和解决问题,如计算流体力学、计算机图形/视觉、机器人/动力学、金融建模、声学和量子化学。这个实现展示了OpenCL能够在硬件特定代码(快速但不可移植)和单源代码(可移植但很慢)之间搭桥,能够在多种硬件上得到一个高效的高性能实现,几乎与硬件特定实现的速度一样快。这些结果通过用OpenCL C编写的内核完成,可以在任何符合规范的OpenCL平台上编译和运行。
附录
  附录A:OpenCL规范定义了大量函数、命名常量和类型。甚至专家级OpenCL程序员在编写代码时也需要查找这些细节。为了提供帮助,我们增加了一个附录,将所有这些细节集中在一起。
示例代码
  本书包含大量示例程序。可以从本书网站(www.openclprogrammingguide.com)下载这些示例。
勘误
  如果你发现本书中有错误,请发邮件通知我们(errors@opencl-book.com)。本书勘误表见本书网站(www.openclprogrammingguide.com)。

上架指导

计算机\程序设计

封底文字

使用全新的OpenCL标准,可以编写能访问所有可用编程资源(如DSP和Cell/B.E.处理器)的应用程序,包括CPU、GPU和其他处理器。Apple、AMD、Intel、IBM、NVIDIA和其他业界巨头都已经实现了OpenCL标准,该标准在PC、服务器、手持/嵌入式设备、高性能计算,甚至云系统等诸多领域都潜力无限。这是OpenCL 领域第一本详尽而实用的权威指南,专门面向从事具体工作的开发人员和软件架构师。  
本书由五位OpenCL核心设计人员携手打造,不仅详细而完整地解读了枯燥的OpenCL规范,而且通过一些重要的案例展示了如何利用OpenCL实现大量并行算法、编写复杂的并行程序、对OpenCL进行性能优化,以及探查硬件和针对硬件进行调整,是系统学习OpenCL的经典参考书。
本书主要内容:  
 OpenCL的概念、体系结构、术语、目标和基本原则。
 OpenCL的平台、上下文和设备。
 使用OpenCL C和运行时API进行并行编程。
 使用缓冲区、子缓冲区、图像、采样器和事件。
 与OpenGL和Microsoft Direct3D共享及同步数据。
 利用C++包装器API简化开发。
 使用OpenCL嵌入式简档支持从手机到超级计算机节点等多种设备。
 多个经典案例的研究和分析,包括:物理模拟、图像和信号处理(如图像 直方图、边界检测过滤器、快速傅里叶变换和光流)、数学库(如矩阵乘法和高性能稀疏矩阵乘法)等。

作者简介

(美)Aaftab Munshi,Benedict R. Gaster, Timothy G. Mattson, James Fung, Dan Ginsburg 著:暂无简介

译者简介

苏金国 李璜 杨健康 等译:暂无简介

译者序

没有人否认现在是信息爆炸的时代,日常生活中需要处理的数据也日益增长。海量的数据带来了各式各样数据处理的需求,如网络浏览、平面或者3D图形加速、数据服务器、分布式云计算等,而现在各计算平台之间的兼容性却不容乐观。
  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实现性能优化。
  本书由苏金国、李璜、杨健康主译,乔会东、仝磊、王少轩、程芳、宋旭民、黄小钰分别对全书各章进行审阅。另外,姚曜、程龙、吴忠望、张练达、陈峰、江健、姚勇、卢鋆、张莹参与了全书的修改整理,林琪、刘亮、刘跃邦、高强和王志淋统一了全书术语,并完善了关键部分的翻译。全体人员共同完成了本书的翻译工作。不过由于水平有限,译文肯定有不当之处,敬请批评指正。

图书目录

译者序

前言
致谢
第一部分 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
1.6.4 OpenCL小结22
1.7 嵌入式简档22
1.8 学习OpenCL23
第2章 HelloWorld:一个OpenCL例子24
2.1 构建示例24
2.1.1 必备条件25
2.1.2 Mac OS X与Code::Blocks25
2.1.3 Microsoft Windows与Visual Studio26
2.1.4 Linux与Eclipse28
2.2 HelloWorld示例29
2.2.1 选择OpenCL平台并创建一个上下文31
2.2.2 选择设备并创建命令队列33
2.2.3 创建和构建程序对象34
2.2.4 创建内核和内存对象36
2.2.5 执行内核37
2.3 检查OpenCL中的错误39
第3章 平台、上下文和设备41
3.1 OpenCL平台41
3.2 OpenCL设备44
3.3 OpenCL上下文53
第4章 OpenCL C编程64
4.1 使用OpenCL C编写数据并行内核64
4.2 标量数据类型65
4.3 矢量数据类型67
4.3.1 矢量字面量68
4.3.2 矢量分量69
4.4 其他数据类型71
4.5 衍生类型71
4.6 隐式类型转换72
4.7 显式强制类型转换76
4.8 显式转换77
4.9 将数据重新解释为另一种类型80
4.10 矢量操作符82
4.10.1 算术操作符83
4.10.2 关系和相等操作符84
4.10.3 位操作符85
4.10.4 逻辑操作符85
4.10.5 条件操作符86
4.10.6 移位操作符86
4.10.7 一元操作符87
4.10.8 赋值操作符88
4.11 限定符89
4.11.1 函数限定符89
4.11.2 内核属性限定符90
4.11.3 地址空间限定符91
4.11.4 访问限定符94
4.11.5 类型限定符95
4.12 关键字95
4.13 预处理器指令和宏96
4.13.1 pragma指令97
4.13.2 宏98
4.14 限制99
第5章 OpenCL C内置函数101
5.1 工作项函数101
5.2 数学函数103
5.2.1 浮点pragma107
5.2.2 浮点常量108
5.2.3 相对误差作为ulp108
5.3 整数函数111
5.4 公共函数113
5.5 几何函数115
5.6 关系函数116
5.7 矢量数据加载和存储函数119
5.8 同步函数124
5.9 异步复制和预取函数125
5.10 原子函数127
5.11 杂项矢量函数130
5.12 图像读、写函数131
5.12.1 读图像132
5.12.2 采样器134
5.12.3 确定边界颜色137
5.12.4 写图像137
5.12.5 查询图像信息138
第6章 程序与内核140
6.1 程序和内核对象概述140
6.2 程序对象140
6.2.1 创建和构建程序141
6.2.2 程序构建选项143
6.2.3 由二进制码创建程序145
6.2.4 管理和查询程序153
6.3 内核对象153
6.3.1 创建内核对象和设置内核参数153
6.3.2 线程安全性156
6.3.3 管理和查询内核157
第7章 缓冲区和子缓冲区159
7.1 内存对象、缓冲区和子缓冲区概述159
7.2 创建缓冲区和子缓冲区160
7.3 查询缓冲区和子缓冲区166
7.4 读、写和复制缓冲区和子缓冲区167
7.5 映射缓冲区和子缓冲区180
第8章 图像和采样器183
8.1 图像和采样器对象183
8.2 创建图像对象184
8.2.1 图像格式187
8.2.2 查询图像支持189
8.3 创建采样器对象189
8.4 处理图像的OpenCL C函数192
8.5 传输图像对象194
第9章 事件201
9.1 命令、队列和事件概述201
9.2 事件和命令队列202
9.3 事件对象206
9.4 宿主机上生成事件208
9.5 影响宿主机上执行的事件209
9.6 使用事件完成评测212
9.7 内核中的事件216
9.8 OpenCL外部的事件217
第10章 与OpenGL的互操作218
10.1 OpenCL/OpenGL共享概述218
10.2 查询OpenGL共享扩展218
10.3 初始化OpenCL上下文实现OpenGL互操作220
10.4 从OpenGL缓冲区创建OpenCL缓冲区221
10.5 由OpenGL纹理创建OpenCL图像对象225
10.6 查询OpenGL对象的信息226
10.7 OpenGL和OpenCL之间的同步227
第11章 与Direct3D的互操作230
11.1 Direct3D/OpenCL共享概述230
11.2 初始化OpenCL上下文实现Direct3D互操作230
11.3 从Direct3D缓冲区和纹理创建OpenCL内存对象233
11.4 OpenCL中获取和释放Direct3D对象236
11.5 OpenCL中处理Direct3D纹理237
11.6 OpenCL中处理D3D顶点数据240
第12章 C++包装器API242
12.1 C++包装器API概述242
12.2 C++包装器API异常244
12.3 使用C++包装器API的矢量相加示例246
12.3.1 选择OpenCL平台并创建一个上下文246
12.3.2 选择一个设备并创建命令队列246
12.3.3 创建和构建程序对象247
12.3.4 创建内核和内存对象248
12.3.5 执行矢量相加内核248
第13章 OpenCL嵌入式简档253
13.1 OpenCL简档概述253
13.2 64位整数254
13.3 图像255
13.4 内置原子函数256
13.5 强制最小单精度数浮点能力256
13.6 OpenCL C程序中确定设备支持的简档258
第二部分 OpenCL 1.1案例研究
第14章 图像直方图260
14.1 计算图像直方图260
14.2 并行实现图像直方图261
14.3 对并行图像直方图的优化266
14.4 每个通道使用半浮点或浮点值计算直方图268
第15章 Sobel边界检测过滤器272
15.1 什么是Sobel边界检测过滤器272
15.2 实现Sobel过滤器作为OpenCL内核272
第16章 并行实现Dijkstra单源最短路径图算法276
16.1 图数据结构276
16.2 内核278
16.3 利用多个计算设备281
第17章 Bullet Physics SDK中的布模拟286
17.1 布模拟介绍286
17.2 模拟柔软物体288
17.3 CPU上执行模拟290
17.4 实现基本GPU执行所需要的修改291
17.5 两层分批296
17.6 SIMD计算和局部内存优化298
17.7 增加OpenGL互操作302
第18章 用快速傅里叶变换模拟海洋305
18.1 Ocean应用程序概述305
18.2 Phillips频谱生成308
18.3 OpenCL离散傅里叶变换311
18.3.1 确定2D分解311
18.3.2 使用局部内存312
18.3.3 确定子变换大小313
18.3.4 确定工作组大小314
18.3.5 得到旋转因子314
18.3.6 确定需要多少局部内存314
18.3.7 避免局部内存库冲突315
18.3.8 使用图像315
18.4 详细分析FFT内核315
18.5 详细分析转置内核318
第19章 光流320
19.1 光流问题概述320
19.2 用硬件线性插值提供亚像素精度328
19.3 纹理缓存的应用329
19.4 使用局部内存329
19.5 提前退出和硬件调度331
19.6 利用OpenGL互操作实现高效可视化331
19.7 性能332
第20章 用PyOpenCL使用OpenCL333
20.1 PyOpenCL介绍333
20.2 运行PyImageFilter2D示例333
20.3 PyImageFilter2D代码334
20.4 上下文和命令队列创建337
20.5 加载到图像对象338
20.6 创建和构建程序339
20.7 设置内核参数和执行内核340
20.8 读取结果340
第21章 使用OpenCL完成矩阵乘法342
21.1 基本矩阵乘法算法342
21.2 直接转换到OpenCL343
21.3 增加每个内核的工作量347
21.4 优化内存移动:局部内存350
21.5 性能结果和优化原来的CPU代码352
第22章 稀疏矩阵矢量乘法354
22.1 稀疏矩阵矢量乘法算法354
22.2 实现描述355
22.3 分块和分组稀疏矩阵表示357
22.4 首部结构359
22.5 分块分组稀疏矩阵设计考虑359
22.6 可选的组信息360
22.7 测试的硬件设备和结果360
22.8 其他优化领域372
附录A OpenCL 1.1小结373

教学资源推荐
作者: (美)Harold Abelson,Gerald Jay Sussman,Julie Sussman
作者: Tom Cargill
作者: 钱晓捷 编著
作者: Keith D.Cooper, Linda Torczon
参考读物推荐
作者: (美)Jennifer Niederst Robbins 著
作者: [美]阿尔文·亚历山大(Alvin Alexander) 著
作者: 施懿民 著
作者: 黄传祿 张克强 赵越 编著