1 并行计算概述3
1.1 并行计算概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 常用基于硬件和软件的并行. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 OpenCL 概述7
2.1 OpenCL 架构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 OpenCL 平台模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 OpenCL 编程的一般步骤. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.1 命令队列. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3.2 OpenCL 内存对象. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.3 OpenCL 程序对象. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.4 Kernel 对象. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.5 Kernel 执行. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3 GPU 架构23
3.1 OpenCLspec 和多核硬件的对应关系. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2 一些关于OpenCL 的特殊主题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3 传统的CPU 架构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4 现代的GPGPU 架构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.5 AMD GPU 硬件架构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.6 Nvdia GPU Femi 架构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.6.1 GTX480-Compute 2.0 capability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.6.2 SIMT 和SIMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.6.3 Nvida GPU 内存机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1