全书一共分为4个部分:第2章介绍了OpenCL C语言的相关语法。第3章到第5章讲解了OpenCL运行时接口及其功能。第6章讲解了OpenCL更底层的工作机制,并结合当前主流的GPGPU做详细分析。第7章到第10章则是以四个实际常用算法来介绍如何用OpenCL做加速并行计算。
通过阅读本书,读者不仅能全面掌握OpenCL的常规用法,而且还能深入了解OpenCL的运作机制,如何将计算设备的性能发挥到极致。这样就可以充分利用硬件特性来调整算法,使得计算速度能达到峰值。
封面图
目录
- 序一
- 序二
- 前言
- 第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.1GPGPU的理念9
- 1.3.2CUDA的崛起10
- 1.3.3OpenCL横空出世10
- 1.4异构并行计算的未来(百花齐放)11
- 1.5本章小结13
- 第2章OpenCL的基本介绍14
- 2.1什么是OpenCL14
- 2.2OpenCL 平台模型15
- 2.3OpenCL 执行模型15
- 2.3.1上下文16
- 2.3.2命令队列17
- 2.3.3内核在OpenCL设备上执行18
- 2.4OpenCL存储器模型19
- 2.4.1存储器区域19
- 2.4.2存储器对象21
- 2.4.3共享虚拟存储器21
- 2.5OpenCL与OpenGL22
- 2.6OpenCL与CUDA23
- 2.7本章小结23
- 第3章进入OpenCL的世界(矢量加法)25
- 3.1构建示例25
- 3.1.1Windows平台26
- 3.1.2Linux平台28
- 3.1.3OS X平台28
- 3.1.4矢量加示例29
- 3.2获得OpenCL平台和设备及其属性36
- 3.2.1OpenCL平台36
- 3.2.2OpenCL设备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.9OpenCL错误处理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.1Blocks语法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.1SVM缓冲操作192
- 5.5.2SVM类型和特性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.2OpenCL 事件机制235
- 6.2.1对OpenCL事件的标记和栅栏244
- 6.2.2内核程序中的同步244
- 6.2.3工作组内同步245
- 6.3原子操作249
- 6.3.1OpenCL 1.2中的原子操作249
- 6.3.2OpenCL 2.0中的原子操作256
- 6.4局部存储器与全局存储器间的异步拷贝268
- 6.5工作组间同步272
- 6.6本章小结280
- 第7章OpenCL与OpenGL互操作281
- 7.1从一个OpenGL上下文来创建OpenCL上下文282
- 7.2OpenCL使用OpenGL共享的缓存对象283
- 7.3OpenCL使用OpenGL纹理数据295
- 7.4OpenCL共享OpenGL渲染缓存308
- 7.5从一个OpenCL存储器对象查询OpenGL对象信息314
- 7.6访问共享对象的OpenCL与OpenGL之间的同步315
- 7.7本章小结320
- 第8章OpenCL到主流GPU处理器的映射321
- 8.1AMD家族GPU321
- 8.1.1AMD Cayman架构GPU321
- 8.1.2AMD GCN架构的GPU326
- 8.2NVIDIA CUDA兼容的GPU333
- 8.2.1NVIDIA GPU架构的执行模型334
- 8.2.2NVIDIA GPU的全局存储器335
- 8.2.3NVIDIA GPU的局部存储器336
- 8.3ARM Mali GPU架构336
- 8.3.1硬件架构337
- 8.3.2存储器层次337
- 8.3.3OpenCL映射337
- 8.4本章小结338
- 第9章OpenCL计算二维卷积339
- 9.1测试平台信息340
- 9.2AMD X86 CPU串行实现341
- 9.2.1简单实现341
- 9.2.2循环展开优化实现342
- 9.2.3AVX指令集优化344
- 9.2.4OpenMP345
- 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
- 附录AOpenCL Query实例372
- 附录B其他主流异构并行计算编程环境简介376