OpenCL领域公认的权威著作,由OpenCL核心设计人员亲自执笔,不仅全面而深刻地解读了OpenCL规范和编程模型,而且通过大量案例和代码演示了基于OpenCL编写并行程序和实现各种并行算法的原理、方法、流程和最佳实践,以及如何对OpenCL进行性能优化,如何对硬件进行探测和调整。
本书分为两大部分:第一部分(1~13章),从介绍OpenCL的核心思想和编写OpenCL程序的基础知识开始,对枯燥的OpenCL规范进行了深刻而系统的解读,旨在帮助读者全面、正确地理解OpenCL规范及其编程模型;第二部分(14~22章),提供了一系列经典的案例,如图像直方图、Sobel边界检测过滤器、并行实现Dijkstra单源最短路径图算法、Bullet Physics SDK中的布模拟、用快速傅里叶变换模拟海洋、光流、OpenCL与PyOpenCL结合使用,使用OpenCL完成矩阵相乘与稀疏矩阵矢量乘法等,目的是让读者通过案例熟练掌握编写复杂并行程序的方法和技巧。本书的附录收录了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
《中国制造业重点领域技术创新绿皮书—技术路线图(2019)》内容简介:本书(以下简称“技术路线图”)围绕建设制造强国的战略任务
《物联网应用开发项目教程(C51和STM32版)》内容简介:本书分为7个项目,按照从基础到技能提升的方式来组织内容,单个任务按照“任
三级PC技术教程(全国计算机等级考试教材系列) 内容简介 本书是根据教育部考试中心*新制定的《全国计算机等级考试大纲 (2004年版)》对三级PC技术的考试范围...
《家屋与嘉绒藏族社会结构》内容简介:本书根据对中国四川省雅安市宝兴县硗碛藏族乡的田野调查资料,以家屋的名号“房名”的研究为
《服装设计创意构思与效果图绘制》内容简介:每一位服装设计师都希望自己的设计作品被认可,分享完成每一件衣服带来的感动。服装设
内容简介:Web应用无处不在,安全隐患如影随形。承载着丰富功能与用途的Web应用程序中布满了各种漏洞,攻击者能够利用这些漏洞盗
《MBA、MPA、MPAcc、MEM管理类联考综合能力逻辑最后冲刺18套卷(含快速提分技法)》内容简介:主要内容是作者收集的除了历年真题以
我们从哪里来?我们为什么存在?我们与地球上的生命应该如何共存?人类从诞生之初起就在一直苦苦追寻这些问题的答案。如今面对环
CSS创意课:全球优秀交互页面设计 本书特色 《CSS创意课——全球优秀交互页面设计》由未来出版编著,王慧玲译,本书涵盖了一切你需要提高的CSS网页布局知识。跟...
《Python预测分析实战》内容简介:本书先介绍预测分析的重要概念和原则,然后给出一系列的代码示例和算法讲解,引导读者了解完整的
《收益递增:转型期中国社会的经济学原理》内容简介:本书内容出自汪丁丁教授近年为北京大学国家发展研究院开设的EMBA课程。作者认
《虚拟人》内容简介:人类躯体死亡,思维是否有可能继续存在,从而实现思维不朽?思维克隆人、网络人等虚拟人将如何颠覆人类对“我
内容简介本书是一部将模糊逻辑与神经网络进行结合研究的论著,介绍了作者近年来在模糊逻辑与神经网络的结合研究与探索中的部分研
《文化何以自信》内容简介:该书阐释和说明了在当今世界不同思想文化相互激荡、文化软实力竞争日趋激烈的背景下,增进文化自信已成
《Java程序员面试秘笈》内容简介:Java程序员目前就业形势较好,因为Java的应用太广泛了,从网页开发到手机安卓开发,都离不开Java
《人民币国际化报告2020:上海如何建设全球金融中心》内容简介:《人民币国际化报告2020》的主题为“上海如何建设全球金融中心”,
学术理论研究著作集萃.理工学科:基于本体数据库的多标签预测模型及生物医药数据挖掘研究 内容简介 《基于本体数据库的多标签预测模型及生物医药数据挖掘研究》共9章。...
《VMware Virtual SAN权威指南(原书第2版)》内容简介:本书共分10章。第1章概要介绍了软件定义的存储和VSAN,第2章从物理和虚拟的
本书全部实例代码及相关工具。基于ARM9+Linux206平台,从基础讲起,引导读者快速入门,实例丰富,可直接应用于工程实践。本书全面
《实用推荐系统》内容简介:本书要构建一个实用的“智能”推荐系统,不仅需要有好的算法,还需要了解接收推荐的用户。本书分为两部