第一部分 OpenCL编程基础 3
第1章 OpenCL简介 3
1.1 OpenCL的来临 4
1.2为什么是OpenCL 5
1.2.1可移植性 5
1.2.2标准化的向量处理 6
1.2.3并行编程 7
1.3类比:OpenCL处理和纸牌游戏 8
1.4 OpenCL应用程序的第一印象 10
1.5 OpenCL标准和扩展 13
1.6框架和SDK 13
1.7小结 14
第2章 主机编程:基本的数据结构 15
2.1基本数据类型 16
2.2获取平台信息 17
2.2.1创建平台结构 17
2.2.2获取平台信息 18
2.2.3示例代码:测试平台的扩展 19
2.3访问安装设备 20
2.3.1创建设备结构 21
2.3.2获取设备信息 22
2.3.3示例代码:测试设备扩展 22
2.4通过上下文管理设备 24
2.4.1创建上下文 25
2.4.2获取上下文信息 26
2.4.3上下文和引用计数 27
2.4.4示例代码:检查上下文的引用计数 27
2.5将设备代码保存在程序中 28
2.5.1创建程序 29
2.5.2编译程序 30
2.5.3获取程序信息 31
2.5.4示例代码:构建来自多个源文件的程序 33
2.6将函数打包为内核 34
2.6.1创建内核 35
2.6.2获取内核信息 35
2.6.3示例代码:获取内核信息 36
2.7用命令队列保存内核 37
2.7.1创建命令队列 38
2.7.2入列内核执行命令 38
2.8小结 39
第3章 主机编程:数据传输和数据划分 41
3.1设置内核参数 42
3.2缓存对象 42
3.2.1分配缓存对象 43
3.2.2创建子缓存对象 45
3.3图像对象 46
3.3.1创建图像对象 46
3.3.2获取图像对象的相关信息 49
3.4获取缓存对象的相关信息 49
3.5内存对象的传输命令 51
3.5.1读/写数据传输 52
3.5.2映射内存对象 55
3.5.3内存对象间的数据复制 57
3.6数据划分 59
3.6.1循环和工作项 60
3.6.2工作项的大小和偏移量 61
3.6.3一个简单的一维例子 62
3.6.4工作组和计算单元 63
3.7小结 64
第4章 内核编程:数据类型和设备内存 66
4.1内核编程简介 67
4.2标量数据类型 68
4.2.1访问双精度数据类型 69
4.2.2字节顺序 70
4.3浮点计算 71
4.3.1浮点数据类型 71
4.3.2双转度数据类型 72
4.3.3 half数据类型 73
4.3.4检查IEEE-754的兼容性 73
4.4向量数据类型 75
4.4.1首选向量宽度 76
4.4.2初始化向量 78
4.4.3读取和修改向量分量 78
4.4.4字节顺序和内存访问 81
4.5 OpenCL设备模型 83
4.5.1内核模型类比的第一部分:学校中学数学的学生 83
4.5.2设备模型类比的第二部分:设备上的工作项 84
4.5.3程序中的地址空间 86
4.5.4内存对齐 88
4.6局部和私有内核参数 88
4.6.1局部参数 89
4.6.2私有参数 89
4.7小结 90
第5章 内核编程:运算符和函数 92
5.1运算符 93
5.2工作组和工作项函数 95
5.2.1维度和工作项 96
5.2.2工作组 97
5.2.3示例应用 97
5.3数据传输操作 98
5.3.1加载和保存同类型的数据 98
5.3.2将标量数组加载保存到向量中 99
5.3.3将向量保存到标量数组中 100
5.4浮点型函数 100
5.4.1算术运算函数和取舍函数 100
5.4.2比较函数 102
5.4.3指数函数和对数函数 103
5.4.4三角函数 103
5.4.5其他类型的浮点函数 105
5.5整数函数 106
5.5.1加法函数和减法函数 106
5.5.2乘法运算 108
5.5.3其他类型的整数函数 109
5.6混洗和选择函数 111
5.6.1混洗函数 111
5.6.2选择函数 113
5.7向量测试函数 115
5.8几何函数 116
5.9小结 118
第6章 图像处理 120
6.1图像对象和采样器 121
6.1.1主机上的图像对象:cl_mem 121
6.1.2主机上的采样器;cl_sampler 122
6.1.3设备上的图像对象:image2d_t和image3d_t 125
6.1.4设备上的采样器:sampler_t 126
6.2图像处理函数 126
6.2.1图像读取函数 127
6.2.2写图像函数 128
6.2.3图像信息函数 129
6.2.4一个简单的例子 130
6.3图像放缩和插值 131
6.3.1最邻近插值 131
6.3.2双线性插值 132
6.3.3用OpenCL编程放大图像 134
6.4小结 135
第7章 事件、性能分析及同步化 136
7.1主机提醒事件 137
7.1.1将事件和命令关联 137
7.1.2将事件和回调函数作关联 138
7.1.3主机提醒的例子 139
7.2命令同步事件 140
7.2.1等待列表和命令事件 141
7.2.2等待列表和用户事件 142
7.2.3额外的命令同步函数 144
7.2.4获取和事件关联的数据 146
7.3性能分析事件 149
7.3.1配置性能分析命令 149
7.3.2对数据传输进行性能分析 151
7.3.3对数据划分进行分析 152
7.4工作项同步化 154
7.4.1障碍和栅栏 155
7.4.2原子操作 156
7.4.3原子命令和互斥 158
7.4.4异步数据传输 160
7.5小结 161
第8章 用C++开发 163
8.1初步了解 164
8.1.1向量和字符串 164
8.1.2异常 165
8.2创建内核 166
8.2.1平台、设备以及上下文 166
8.2.2程序和内核 169
8.3内核参数和内存对象 172
8.3.1内存对象 173
8.3.2通用数据参数 177
8.3.3局部内存参数 178
8.4命令队列 179
8.4.1创建CommandQueue对象 179
8.4.2入列内核执行命令 179
8.4.3读写命令 181
8.4.4内存映射和复制命令 183
8.5事件处理 185
8.5.1主机提醒 185
8.5.2命令同步化 187
8.5.3性能分析事件 188
8.5.4另外的事件函数 189
8.6小结 190
第9章 用Java和Python来开发 192
9.1 Aparapi 193
9.1.1Aparapi安装 193
9.1.2 Kernel类 194
9.1.3工作项和工作组 195
9.2 JavaCL 197
9.2.1 JavaCL安装 198
9.2.2 JavaCL开发概述 198
9.2.3用JavaCL来创建内核 199
9.2.4设定内核参数以及入列命令 202
9.3PyOpenCL 206
9.3.1PyOpenCL安装和许可 206
9.3.2 PyOpenCL开发概述 207
9.3.3用PyOpenCL创建内核 207
9.3.4设置参数和执行内核 211
9.4小结 215
第10章 通用编程原则 217
10.1全局大小和局部大小 218
10.1.1找出工作组大小的上限值 218
10.1.2测试内核和设备 220
10.2数值归并 221
10.2.1 OpenCL的归并算法 221
10.2.2使用向量提升归并运算的速度 224
10.3工作组间的同步化 225
10.4设计高性能内核的10条技巧 227
10.5小结 229
第二部分 用OpenCL来编程实现实际的算法 233
第11章 归并与排序 233
11.1 MapReduce 234
11.1.1 MapReduce简介 234
11.1.2 MapReduce和OpenCL 236
11.1.3 MapReduce例子:字符串查找 238
11.2双调排序 240
11.2.1理解双调排序算法 240
11.2.2用OpenCL来实现双调排序 243
11.3基数排序 249
11.3.1理解基数排序 250
11.3.2用向量实现基数排序 250
11.4小结 252
第12章 矩阵和QR分解 253
12.1矩阵转置 254
12.1.1矩阵简介 254
12.1.2矩阵转置的理论和实现 254
12.2矩阵乘法 257
12.2.1矩阵乘法理论 257
12.2.2用OpenCL编程实现矩阵乘法 258
12.3Householder变换 259
12.3.1向量投影 260
12.3.2向量反射 261
12.3.3外积和Householder矩阵 262
12.3.4用OpenCL编程实现向量反射 263
12.4 QR分解 264
12.4.1计算Householder向量和R矩阵 265
12.4.2计算Householder矩阵和矩阵Q 266
12.4.3用OpenCL编程实现QR分解 267
12.5小结 270
第13章 稀疏矩阵 272
13.1差分方程和稀疏矩阵 273
13.2稀疏矩阵的存储以及Harwell-Boeing数据集 274
13.2.1Harwell-Boeing数据集简介 274
13.2.2访问Matrix Market文件中的数据 275
13.3最速下降法 278
13.3.1正定矩阵 279
13.3.2最速下降法理论 279
13.3.3用openCL编程实现SD算法 281
13.4共轭梯度法 283
13.4.1正交化和共轭 283
13.4.2正交化和GRAM-SCHMIDT法 283
13.4.3共轭梯度法 285
13.5小结 287
第14章 信号处理和快速傅里叶变换 289
14.1频率分析简介 289
14.2离散傅里叶变换 291
14.2.1 DFT背后的理论 292
14.2.2 OpenCL和DFT 298
14.3快速傅里叶变换 299
14.3.1 DFT的三条性质 299
14.3.2构建快速傅里叶变换 302
14.3.3用OpenCL来实现FFT 306
14.4小结 311
第三部分 用OpenCL来加速OpenGL 315
第15章 将OpenCL和OpenGL结合 315
15.1在OpenGL和OpenCL之间共享数据 316
15.1.1创建OpenCL上下文 317
15.1.2在OpenGL和OpenCL之间共享数据 319
15.1.3同步化对共享数据的访问 322
15.2获取信息 323
15.2.1获取OpenGL对象和纹理信息 323
15.2.2获取OpenGL上下文的相关信息 324
15.3基本的互操作例子 325
15.3.1初始化OpenGL操作 325
15.3.2初始化OpenCL操作 326
15.3.3创建数据对象 327
15.3.4执行内核 327
15.3.5渲染图形 328
15.4互操作和动画 329
15.4.1确定顶点数据 329
15.4.2动画和显示 330
15.4.3执行内核 331
15.5小结 332
第16章 纹理和渲染缓存 334
16.1图像滤波 335
16.1.1高斯模糊 337
16.1.2图像锐化 337
16.1.3图像浮雕化 338
16.2用OpenCL来对纹理滤波 339
16.2.1 init_gl函数 339
16.2.2 init_cl函数 339
16.2.3 configure_shared_data函数 340
16.2.4 execute_kernel函数 341
16.2.5 display函数 342
16.3小结 343
附录A 安装和使用软件开发包 344
A.1了解OpenCL SDK 344
A.1.1检查设备的兼容性 344
A.1.2 OpenCL头文件和库文件 345
A.2Windows上的OpenCL 347
A.2.1在Windows上安装AMD显卡驱动 347
A.2.2用AMD显卡来编译Windows应用程序 349
A.2.3在Windows上安装Nvidia的显卡驱动 349
A.2.4用Nvidia显卡来编译Windows应用程序 351
A.3Linux上的OpenCL 351
A.3.1在Linux上安装AMD的显卡驱动 351
A.3.2在Linux上安装Nvidia显卡驱动 352
A.3.3在Linux上编译OpenCL应用程序 354
A.4在Mac OS上安装OpenCL 355
A.5小结 356
附录B 用OpenGL作实时渲染 357
B.1安装OpenGL 358
B.1.1在Windows上安装OpenGL 359
B.1.2在Linux上安装OpenGL 359
B.1.3在Mac OS上安装OpenGL 360
B.2在主机上开发OpenGL应用程序 360
B.2.1将数据放到顶点缓存对象(VBO)之中 361
B.2.2配置顶点属性 363
B.2.3编译和部署着色器 365
B.2.4启动渲染过程 367
B.3开发着色器程序 369
B.3.1着色器编程简介 370
B.3.2顶点着色器 373
B.3.3片段着色器 374
B.4用GLUT来创建OpenGL窗口 375
B.4.1配置和创建窗口 375
B.4.2事件处理 376
B.4.3显示窗口 377
B.5将OpenGL和GLUT结合 379
B.5.1GLUT/OpenGL初始化 379
B.5.2设置视窗(viewport) 381
B.5.3渲染模型 381
B.6添加纹理 382
B.6.1在主机应用程序中创建纹理 383
B.6.2顶点着色器中的纹理映射 386
B.6.3在片段着色器中使用纹理 387
B.7小结 388
附录C 面向Windows和OpenCL的最简GNU 390
C.1在Windows下安装MinGW 390
C.1.1获取并运行图形安装工具 391
C.1.2在MinGW下安装新工具 393
C.2编译MinGW可执行程序 394
C.2.1用MinGW编译HelloWorld! 394
C.2.2GNU编译器 395
C.3Makefiles 396
C.3.1 GNU makefile的结构 396
C.3.2目标和伪目标 399
C.3.3简单的makefile例子 401
C.4编译OpenCL应用程序 401
C.5小结 403
附录D Appendix D移动设备上的OpenCL 404
D.1数值处理 404
D.2图像处理 405
D.3小结 406