重磅推荐
【前言】

Preface 前  言为什么要写这本书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(中国)有限公司免费为我们提供实验设备。
感谢家人对我们写作的支持,感谢他们容忍了我们晚上加班回家后,还要在电脑前写作!
谨以此书献给我爱的家人,以及众多热爱异构并行计算的朋友们!愿你们快乐地阅读本书!
风辰


【内容简介】

  本书一共分为4个部分:第1章介绍并行计算的沿革与现状。第2章介绍了OpenCLC语言的相关语法。第3章到第5章讲解了OpenCL运行时接口及其功能。第6章讲解了OpenCL更底层的工作机制,并结合当前主流的GPGPU做详细分析。第7章到第11章则是以四个实际常用算法来介绍如何用OpenCL做加速并行计算。通过阅读本书,读者不仅能全面掌握OpenCL的常规用法,而且还能深入了解OpenCL的运作机制,如何将计算设备的性能发挥到极致。这样就可以充分利用硬件特性来调整算法,使得计算速度能达到峰值。


【目录】

目  录 Contents
序一
序二
前言
第1章 异构并行计算的过去、现状和未来 1
1.1 单核标量处理器的困境 3
1.1.1 单核标量处理器如何提高性能 4
1.1.2 为什么单核标量处理器性能到达瓶颈 6
1.2 多核并行计算与向量化的出现 7
1.2.1 为什么会有多核 7
1.2.2 为什么会有向量化 7
1.2.3 如何利用多核和向量化的能力 8
1.2.4 多核和向量化的难点 8
1.3 异构并行计算的崛起 9
1.3.1 GPGPU的理念 9
1.3.2 CUDA的崛起 10
1.3.3 OpenCL横空出世 10
1.4 异构并行计算的未来(百花齐放) 11
1.5 本章小结 13
第2章 OpenCL的基本介绍 14
2.1 什么是OpenCL 14
2.2 OpenCL 平台模型 15
2.3 OpenCL 执行模型 15
2.3.1 上下文 16
2.3.2 命令队列 17
2.3.3 内核在OpenCL设备上执行 18
2.4 OpenCL存储器模型 19
2.4.1 存储器区域 19
2.4.2 存储器对象 21
2.4.3 共享虚拟存储器 21
2.5 OpenCL与OpenGL 22
2.6 OpenCL与CUDA 23
2.7 本章小结 23
第3章 进入OpenCL的世界(矢量加法) 25
3.1 构建示例 25
3.1.1 Windows平台 26
3.1.2 Linux平台 28
3.1.3 OS X平台 28
3.1.4 矢量加示例 29
3.2 获得OpenCL平台和设备及其属性 36
3.2.1 OpenCL平台 36
3.2.2 OpenCL设备 40
3.3 创建上下文和命令队列 51
3.3.1 创建OpenCL上下文 51
3.3.2 创建命令队列 56
3.4 创建程序对象和内核对象 58
3.5 程序对象 59
3.5.1 创建程序对象 59
3.5.2 构建程序对象 61
3.5.3 查询和管理程序对象 66
3.6 内核对象 69
3.6.1 创建内核对象 69
3.6.2 设置内核参数 70
3.6.3 查询和管理内核对象 73
3.7 执行内核 75
3.8 编写内核代码 76
3.9 OpenCL错误处理 78
3.10 本章小结 81
第4章 OpenCL C语言 82
4.1 修饰符 82
4.1.1 地址空间修饰符 82
4.1.2 函数修饰符 86
4.1.3 对象访问修饰符 88
4.2 标量数据类型 88
4.3 矢量数据类型 91
4.3.1 为什么要有矢量数据类型 92
4.3.2 矢量数据的使用 93
4.4 运算符 96
4.5 工作项布局函数 99
4.5.1 维度和工作项 100
4.5.2 工作组 101
4.6 数据拷贝操作 102
4.6.1 矢量数据拷贝 102
4.6.2 异步拷贝和预取 104
4.7 浮点函数 105
4.7.1 数学函数 106
4.7.2 公共函数 109
4.7.3 几何函数 110
4.8 整数函数 110
4.9 关系函数 112
4.10 杂项矢量函数 115
4.11 同步函数 117
4.12 原子函数 119
4.13 图像读/写函数 122
4.13.1 内建图像读函数 122
4.13.2 内建无采样器图像读 函数 126
4.13.3 内建图像写函数 129
4.13.4 内建图像查询函数 131
4.14 工作组函数 132
4.15 管道函数 134
4.15.1 内建管道读/写函数 135
4.15.2 内建工作组管道读/写函数 139
4.15.3 内建管道查询函数 140
4.16 设备队列 140
4.16.1 Blocks语法 142
4.16.2 设备队列相关函数 143
4.16.3 子内核存储器可见性 147
4.16.4 设备队列的使用示例 148
4.17 本章小结 153
第5章 OpenCL存储器对象 154
5.1 缓冲区 154
5.1.1 分配缓冲区对象 154
5.1.2 创建子缓冲区对象 157
5.2 图像对象和采样器对象 160
5.2.1 图像对象 160
5.2.2 采样器对象 166
5.2.3 图像旋转示例 171
5.3 管道 175
5.3.1 创建管道对象 175
5.3.2 管道对象查询 175
5.4 存储器对象数据传输 176
5.4.1 主机与设备间数据传输 176
5.4.2 存储器对象数据填充 181
5.4.3 存储器对象间数据传输 184
5.4.4 存储器对象映射 187
5.5 共享虚拟存储器 192
5.5.1 SVM缓冲操作 192
5.5.2 SVM类型和特性 197
5.5.3 相关示例 204
5.6 存储器一致性模型 208
5.6.1 存储器次序规则 214
5.6.2 原子操作的存储器次序规则 217
5.6.3 栅栏操作的存储器次序规则 219
5.6.4 工作组函数的存储器次序规则 220
5.6.5 主机端与设备端命令的存储器次序规则 221
5.6.6 关于存储器次序在实际OpenCL计算设备中的实现 223
5.7 本章小结 230
第6章 OpenCL同步及事件机制 231
6.1 主机端的OpenCL同步 232
6.2 OpenCL 事件机制 235
6.2.1 对OpenCL事件的标记和栅栏 244
6.2.2 内核程序中的同步 244
6.2.3 工作组内同步 245
6.3 原子操作 249
6.3.1 OpenCL 1.2中的原子操作 249
6.3.2 OpenCL 2.0中的原子操作 256
6.4 局部存储器与全局存储器间的异步拷贝 268
6.5 工作组间同步 272
6.6 本章小结 280
第7章 OpenCL与OpenGL互操作 281
7.1 从一个OpenGL上下文来创建OpenCL上下文 282
7.2 OpenCL使用OpenGL共享的缓存对象 283
7.3 OpenCL使用OpenGL纹理数据 295
7.4 OpenCL共享OpenGL渲染缓存 308
7.5 从一个OpenCL存储器对象查询OpenGL对象信息 314
7.6 访问共享对象的OpenCL与OpenGL之间的同步 315
7.7 本章小结 320
第8章 OpenCL到主流GPU处理器的映射 321
8.1 AMD家族GPU 321
8.1.1 AMD Cayman架构GPU 321
8.1.2 AMD GCN架构的GPU 326
8.2 NVIDIA CUDA兼容的GPU 333
8.2.1 NVIDIA GPU架构的执行模型 334
8.2.2 NVIDIA GPU的全局存储器 335
8.2.3 NVIDIA GPU的局部存储器 336
8.3 ARM Mali GPU架构 336
8.3.1 硬件架构 337
8.3.2 存储器层次 337
8.3.3 OpenCL映射 337
8.4 本章小结 338
第9章 OpenCL计算二维卷积 339
9.1 测试平台信息 340
9.2 AMD X86 CPU串行实现 341
9.2.1 简单实现 341
9.2.2 循环展开优化实现 342
9.2.3 AVX指令集优化 344
9.2.4 OpenMP 345
9.3 简单OpenCL实现 347
9.4 使用常量存储器优化 349
9.5 使用局部存储器优化 351
9.6 一个工作项同时计算多个输出 353
9.7 本章小结 355
第10章 OpenCL计算矩阵乘法 356
10.1 串行实现 357
10.1.1 初次实现 357
10.1.2 缓存友好的实现 357
10.1.3 使用AVX指令集实现 358
10.2 简单OpenCL实现 359
10.3 使用局部存储器优化 361
10.4 使用向量加载指令 363
10.5 一个工作项同时计算多个输出 365
10.6 优化流水线性能 368
10.7 本章小结 371
附录A OpenCL Query实例 372
附录B 其他主流异构并行计算编程环境简介 376

<


【编辑推荐】

返回顶部