没有合适的资源?快使用搜索试试~ 我知道了~
首页OpenCL中文入门完整教程
OpenCL中文入门完整教程
5星 · 超过95%的资源 需积分: 50 408 下载量 155 浏览量
更新于2023-03-16
评论 9
收藏 5.4MB PDF 举报
这个教程是引导我opencl入门的教程,挺有帮助的。介绍了opencl内存对象,kernel编写,GPU架构,线程调度,性能优化,都有具体例子。
资源详情
资源评论
资源推荐
AMD OpenCL 大学教程中文版
*
迈克老狼 @opengpu.org
†
January 10, 2012
目录
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
3.7 Cell Broadband Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.8 OpenCL 编译系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.9 Installable Client Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4 OpenCL buffer 使用及两个简单例子 33
4.1 创建 OpenCL 设备缓冲 (buffer) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2 图像旋转的例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.3 一个矩阵乘法的例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5 GPU memory 结构 37
5.1 GPU 总线寻址介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2 合并内存访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.3 Global memory 的 bank 以及 channel 访问冲突 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.4 Local memory 的 bank conflit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
*
英文原版地址:点击这里。
†
欢迎光临 OpenGPU 专业论坛:http://www.opengpu.org
1
目录
6 GPU 线程及调度 41
6.1 Workgroup 到硬件线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.2 AMD wave 调度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.3 NV warp 调度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.4 Occupancy 开销 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.5 控制流和分支预测 (prediction) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.6 Warp voting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
7 性能优化 45
7.1 线程映射 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
7.2 Occupancy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
7.3 向量化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
8 性能优化案例 NBody 49
8.1 NBody . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
8.2 NBody 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
8.3 OpenCL 优化 Nbody . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2
1 并行计算概述
1 并行计算概述
1.1 并行计算概述
在计算机术语中,并行性描述了把一个复杂问题分解成多个能同时处理的子问题的能力。要实现并行计算,首先我们
要有物理上能够实现并行计算的硬件设备,比如多核 CPU,每个核能同时实现算术或逻辑运算。
在 GPU 并行计算中,通常我们实现两类并行计算:
• 任务并行:把一个问题分解为能够同时执行的多个任务。
• 数据并行:同一个任务内,它的各个部分同时执行。
下面我们通过一个农场主雇佣工人摘苹果的例子来描述不同种类的并行计算。
• 摘苹果的工人就是硬件上的并行处理单元(process elements)。
• 树就是要执行的任务。
• 苹果就是要处理的数据。
串行的任务处理就如下图所示,一个工人背着梯子摘完所有树上的苹果(一个处理单元处理完所有任务的数据)。
数据并行就好比农场主雇佣了好多工人来摘完一个树上的苹果(多个处理单元并行完成一个任务中的数据),这样就能很
快摘完一颗树上的苹果。
3
1 并行计算概述
农场主也可以为每棵树分配一个人,这就好比任务并行。在每个任务内,由于只有一个工人,所以是执行串行的,但任务之
间是并行的。
对一个复杂问题,影响并行计算的因素很多。通常,我们都是通过分解问题的方式来实施并算法行。这又包括两方面
内容:
• 任务分解:通常是把算法分解成很多的小任务,就像前面的例子中,把果园按苹果树进行划分,这时我们并不关注数
据,也就是说不关注每个树上到底有多少个苹果。
• 数据分解:就是把很多数据,分成不同的、离散的小块,这些数据块能够被并行执行,就好比前面例子中的苹果。
通常我们按照算法之间的依赖关系来分解任务,这样就形成了一个任务关系图。一个任务只有没有依赖任务的时候,
才能够被执行。
这有点类似于我们数据结构中的有向无环图,两个没有连通路径的任务之间可以并行执行。下面再给一个烤面包的例子,
如果所示,预热烤箱和购买面粉糖两个任务之间可以并行执行。
4
1 并行计算概述
对大多数科学计算和工程应用来说,数据分解一般都是基于输出数据, 例如:
• 在一副图像中,对一个滑动窗口(例如:3*3 像素) 内的像素实施滤波操作,可以得到一个输出像素的卷积。
• 第一个输入矩阵的第 i 行乘以第二个输入矩阵的第 j 列,得到的向量和即为输出矩阵第 i 行,第 j 列的元素。
这种方法对于输入和输出数据是一对一,或者多对一的对应关系比较有效。
也有的数据分解算法是基于输入数据的,这时,输入数据和输出数据一般是一对多的关系,比如求图像的直方图,我们
要把每个像素放到对应的槽中 (bins,对于灰度图,bin 数量通常是 256)。一个搜索函数,输入可能是多个数据,输出却只
有一个值。对于这类应用,我们一般用每个线程计算输出的一部分,然后通过同步以及原子操作得到最终的值,OpenCL
中求最小值的 kernel 函数就是典型代表
1
。
通常来说,怎样分解问题和具体算法有关,而且还要考虑自己使用的硬件和软件,比如 AMD GPU 平台和 Nvdia GPU
平台的优化就有很多不同。
1.2 常用基于硬件和软件的并行
在上个实际 90 年代,并行计算主要研究如何在 cpu 上实施指自动的指令级并行。
• 同时发射多条指令(之间没有依赖关系),并行执行这些指令。
• 在本教程中,我么不讲述自动的硬件级并行,感兴趣的话,可以看看计算机体系结构的教程。
高层的并行,比如线程级别的并行,一般很难自动化,需要程序员告诉计算机,该做什么,不该做什么。这时,程序员还
要考虑硬件的具体指标,通常特定硬件都是适应于某一类并行编程,比如多核 cpu 就适合基于任务的并行编程,而 GPU
更适应于数据并行编程。
Hardware type Examples Parallelism
Multi-core superscalar processors Phenom II CPU Task
Vector or SIMD processors SSE units (x86 CPUs) Data
Multi-core SIMD processors Radeon 5870 GPU Data
现代的 GPU 有很多独立的运算核(processor)组成,在 AMD GPU 上就是 stream core,这些 core 能够执行 SIMD
操作(单指令,多数据),所以特别适合数据并行操作。通常 GPU 上执行一个任务,都是把任务中的数据分配到各个独立
的 core 中执行。
在 GPU 上,我们一般通过循环展开,Loop strip mining 技术,来把串行代码改成并行执行的。比如在 CPU 上,如果我
们实现一个向量加法,代码通常如下:
for(i = 0; i < n; i++)
{
C[i] = A[i] + B;
}
在 GPU 上,我们可以设置 n 个线程,每个线程执行一个加法,这样大大提高了向量加法的并行性。
1
可以看下 ATI Stream Computing OpenCL programming guide 第二章中求最小值的 kernel 例子
5
剩余53页未读,继续阅读
jerryzhouyh
- 粉丝: 13
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2023年中国辣条食品行业创新及消费需求洞察报告.pptx
- 2023年半导体行业20强品牌.pptx
- 2023年全球电力行业评论.pptx
- 2023年全球网络安全现状-劳动力资源和网络运营的全球发展新态势.pptx
- 毕业设计-基于单片机的液体密度检测系统设计.doc
- 家用清扫机器人设计.doc
- 基于VB+数据库SQL的教师信息管理系统设计与实现 计算机专业设计范文模板参考资料.pdf
- 官塘驿林场林防火(资源监管)“空天地人”四位一体监测系统方案.doc
- 基于专利语义表征的技术预见方法及其应用.docx
- 浅谈电子商务的现状及发展趋势学习总结.doc
- 基于单片机的智能仓库温湿度控制系统 (2).pdf
- 基于SSM框架知识产权管理系统 (2).pdf
- 9年终工作总结新年计划PPT模板.pptx
- Hytera海能达CH04L01 说明书.pdf
- 数据中心运维操作标准及流程.pdf
- 报告模板 -成本分析与报告培训之三.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2