第一部分OpenCL1.1语言与API 2
第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平台API 19
1.6.2运行时API 20
1.6.3内核编程语言 20
1.6.4 OpenCL小结 22
1.7嵌入式简档 22
1.8学习OpenCL 23
第2章HelloWorld:一个OpenCL例子 24
2.1构建示例 24
2.1.1必备条件 25
2.1.2 Mac OS X与Code::Blocks 25
2.1.3 Microsoft Windows与Visual Studio 26
2.1.4 Linux与Eclipse 28
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浮点pragma 107
5.2.2浮点常量 108
5.2.3相对误差作为ulp 108
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章与Direct3 D的互操作 230
11.1 Direct3D/OpenCL共享概述 230
11.2初始化OpenCL上下文实现Direct3 D互操作 230
11.3从Direct3 D缓冲区和纹理创建OpenCL内存对象 233
11.4 OpenCL中获取和释放Direct3 D对象 236
11.5 OpenCL中处理Direct3 D纹理 237
11.6 OpenCL中处理D3 D顶点数据 240
第12章C++包装器API 242
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案例研究 260
第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使用OpenCL 333
20.1 PyOpenCL介绍 333
20.2运行PyImageFilter2 D示例 333
20.3PyImageFilter2 D代码 334
20.4上下文和命令队列创建 337
20.5加载到图像对象 338
20.6创建和构建程序 339
20.7设置内核参数和执行内核 340
20.8读取结果 340
第21章 使用OpenCL完成矩阵乘法 342
21.1基本矩阵乘法算法 342
21.2直接转换到OpenCL 343
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