1、OpenCL异构并行计算:原理、机制与优化实践序一01序一 序二02序二 1 异构并行计算的过去、现状和未来031 异构并行计算的过去、现状和未来1.1 单核标量处理器的困境1.2 多核并行计算与向量化的出现1.5 本章小结1.3 异构并行计算的崛起1.4 异构并行计算的未来(百花齐放)LOGOM.94275.CN1 异构并行计算的过去、现状和未来1.1 单核标量处理器的困境AB1.1.2 为什么单核标量处理器性能到达瓶颈1.1.1 单核标量处理器如何提高性能1.2 多核并行计算与向量化的出现1 异构并行计算的过去、现状和未来1.2.2 为什么会有向量化1.2.4 多核和向量化的难点1.2.1
2、 为什么会有多核1.2.3 如何利用多核和向量化的能力1 异构并行计算的过去、现状和未来1.3 异构并行计算的崛起CBA1.3.1 GPGPU的理念1.3.2 CUDA的崛起1.3.3 OpenCL横空出世2 OpenCL的基本介绍042 OpenCL的基本介绍2.1 什么是OpenCL2.2 OpenCL平台模型2.3 OpenCL执行模型2.6 OpenCL与CUDA2.5 OpenCL与OpenGL2.4 OpenCL存储器模型2.7 本章小结2 OpenCL的基本介绍2 OpenCL的基本介绍2.4 OpenCL存储器模型2.4.1 存储器区域2.4.2 存储器对象2.4.3 共享虚拟
3、存储器3 进入OpenCL的世界(矢量加法)053 进入OpenCL的世界(矢量加法)3.1 构建示例3.2 获得OpenCL平台和设备及其属性3.3 创建上下文和命令队列3.4 创建程序对象和内核对象3.5 程序对象3.6 内核对象3 进入OpenCL的世界(矢量加法)3.1 构建示例3.1.1 Windows平台3.1.2 Linux平台3.1.3 OS X平台3.1.4 矢量加示例LOGOM.94275.CN3 进入OpenCL的世界(矢量加法)3.2 获得OpenCL平台和设备及其属性3.2.1 OpenCL平台013.2.2 OpenCL设备02LOGOM.94275.CN3 进入O
4、penCL的世界(矢量加法)3.3 创建上下文和命令队列A3.3.1 创建OpenCL上下文3.3.2 创建命令队列B3.5 程序对象3 进入OpenCL的世界(矢量加法)3.5.2 构建程序对象3.5.1 创建程序对象3.5.3 查询和管理程序对象3.6 内核对象3 进入OpenCL的世界(矢量加法)3.6.2 设置内核参数3.6.1 创建内核对象3.6.3 查询和管理内核对象4 OpenCL C语言064 OpenCL C语言4.1 修饰符4.2 标量数据类型4.3 矢量数据类型4.6 数据拷贝操作4.5 工作项布局函数4.4 运算符4 OpenCL C语言A4.7 浮点函数B4.8 整数
5、函数C4.9 关系函数D4.10 杂项矢量函数E4.11 同步函数F4.12 原子函数4 OpenCL C语言DCBA4.13 图像读/写函数4.14 工作组函数4.15 管道函数4.16 设备队列E4.17 本章小结4 OpenCL C语言4.1 修饰符CBA4.1.1 地址空间修饰符4.1.2 函数修饰符4.1.3 对象访问修饰符4 OpenCL C语言4.3 矢量数据类型A4.3.1 为什么要有矢量数据类型4.3.2 矢量数据的使用B4.5 工作项布局函数4 OpenCL C语言4.5.1 维度和工作项4.5.2 工作组4 OpenCL C语言4.6 数据拷贝操作A4.6.1 矢量数据拷
6、贝4.6.2 异步拷贝和预取B4 OpenCL C语言4.7 浮点函数4.7.1 数学函数4.7.2 公共函数4.7.3 几何函数4 OpenCL C语言4.13 图像读/写函数14.13.1 内建图像读函数24.13.2 内建无采样器图像读函数34.13.3 内建图像写函数44.13.4 内建图像查询函数4.15 管道函数4 OpenCL C语言4.15.2 内建工作组管道读/写函数4.15.1 内建管道读/写函数4.15.3 内建管道查询函数4.16 设备队列4 OpenCL C语言4.16.1 Blocks语法4.16.2 设备队列相关函数4.16.3 子内核存储器可见性4.16.4 设
7、备队列的使用示例DCAB5 OpenCL存储器对象075 OpenCL存储器对象5.2 图像对象和采样器对象5.4 存储器对象数据传输5.6 存储器一致性模型5.1 缓冲区5.3 管道5.5 共享虚拟存储器5 OpenCL存储器对象5.7 本章小结5 OpenCL存储器对象5.1 缓冲区5.1.1 分配缓冲区对象5.1.2 创建子缓冲区对象LOGOM.94275.CN5 OpenCL存储器对象5.2 图像对象和采样器对象5.2.1 图像对象5.2.2 采样器对象5.2.3 图像旋转示例5 OpenCL存储器对象5.3 管道5.3.1 创建管道对象15.3.2 管道对象查询25 OpenCL存储
8、器对象5.4 存储器对象数据传输15.4.1 主机与设备间数据传输25.4.2 存储器对象数据填充35.4.3 存储器对象间数据传输45.4.4 存储器对象映射LOGOM.94275.CN5 OpenCL存储器对象5.5 共享虚拟存储器5.5.1 SVM缓冲操作5.5.2 SVM类型和特性5.5.3 相关示例LOGOM.94275.CN5 OpenCL存储器对象5.6 存储器一致性模型15.6.1 存储器次序规则35.6.3 栅栏操作的存储器次序规则55.6.5 主机端与设备端命令的存储器次序规则25.6.2 原子操作的存储器次序规则45.6.4 工作组函数的存储器次序规则65.6.6 关于存
9、储器次序在实际OpenCL计算设备中的实现6 OpenCL同步及事件机制086 OpenCL同步及事件机制AEDFBC6.2 OpenCL事件机制6.3 原子操作6.5 工作组间同步6.4 局部存储器与全局存储器间的异步拷贝6.6 本章小结6.1 主机端的OpenCL同步6.2 OpenCL事件机制6 OpenCL同步及事件机制6.2.2 内核程序中的同步6.2.1 对OpenCL事件的标记和栅栏6.2.3 工作组内同步6 OpenCL同步及事件机制6.3 原子操作AB6.3.2 OpenCL 2.0中的原子操作6.3.1 OpenCL 1.2中的原子操作7 OpenCL与OpenGL互操作0
10、97 OpenCL与OpenGL互操作7.1 从一个OpenGL上下文来创建OpenCL上下文7.2 OpenCL使用OpenGL共享的缓存对象7.3 OpenCL使用OpenGL纹理数据7.4 OpenCL共享OpenGL渲染缓存7.5 从一个OpenCL存储器对象查询OpenGL对象信息7.6 访问共享对象的OpenCL与OpenGL之间的同步7 OpenCL与OpenGL互操作7.7 本章小结8 OpenCL到主流GPU处理器的映射108 OpenCL到主流GPU处理器的映射8.1 AMD家族GPU8.2 NVIDIA CUDA兼容的GPU8.3 ARM Mali GPU架构8.4 本章
11、小结8 OpenCL到主流GPU处理器的映射8.1 AMD家族GPU8.1.1 AMD Cayman架构GPU8.1.2 AMD GCN架构的GPULOGOM.94275.CN8 OpenCL到主流GPU处理器的映射8.2 NVIDIA CUDA兼容的GPU8.2.1 NVIDIA GPU架构的执行模型8.2.2 NVIDIA GPU的全局存储器8.2.3 NVIDIA GPU的局部存储器LOGOM.94275.CN8 OpenCL到主流GPU处理器的映射8.3 ARM Mali GPU架构8.3.1 硬件架构018.3.3 OpenCL映射038.3.2 存储器层次029 OpenCL计算二
12、维卷积119 OpenCL计算二维卷积9.6 一个工作项同时计算多个输出9.5 使用局部存储器优化9.4 使用常量存储器优化9.3 简单OpenCL实现9.2 AMD X86 CPU串行实现9.1 测试平台信息9 OpenCL计算二维卷积9.7 本章小结9 OpenCL计算二维卷积9.2 AMD X86 CPU串行实现9.2.1 简单实现019.2.3 AVX指令集优化039.2.2 循环展开优化实现029.2.4 OpenMP0410 OpenCL计算矩阵乘法1210 OpenCL计算矩阵乘法10.2 简单OpenCL实现10.4 使用向量加载指令10.6 优化流水线性能10.1 串行实现10.3 使用局部存储器优化10.5 一个工作项同时计算多个输出10 OpenCL计算矩阵乘法10.7 本章小结10 OpenCL计算矩阵乘法10.1 串行实现CBA10.1.1 初次实现10.1.2 缓存友好的实现10.1.3 使用AVX指令集实现附录A OpenCL Query实例13附录A OpenCL Query实例附录B 其他主流异构并行计算编程环境简介14附录B 其他主流异构并行计算编程环境简介感谢聆听