OPENCL编程学习
一、基本介绍
OPENCL(open computing language) 是一个工业级开放的异构编程标准,它同时提供了一个并行编程的框架和封装库,可以让编程人员编写高性能并且可移高的代码。
二、基础内容
下面将从四个方面对opencl进行阐述,分别是基本框架、内存组织、执行模型、编程模型:
2.1 基本框架
opencl基本框架如下图:

| 关键字 | 释义 |
|---|---|
| Compute Device | 计算设备(GPU/ANIC/FPGA) |
| Compute Unit | 计算单元(类似gpu sm) |
| Process element | 计算单元(l类似gpu wrap) 设备执行的基本单元 |
| HOST | 主机设备 |
2.2 执行模型
opencl执行模型图如下:

| 关键字 | 释义 |
|---|---|
| kernel | 在device端执行的程序 |
| work-item | 在device端一个执行的kernel集合(类似cuda thread) |
| work-group | 管理work-items一个集合(类似cuda block) |
三、内存组织
内存逻辑分布图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaGsmIwM-1617343931193)(D:\work\文档\openclMemory.png)]
| 关键字 | 释义 |
|---|---|
| global memory | 全局内存所有work-group中数据都是可见的 |
| constant memory | 全局内存,但是在kernel执行的时候被创建为constant属性 |
| local memory | 该内存只在work-group中可见,看设备实现有可能是global memory或者片内内存 |
| private memory | 该内存只在work-item中可见,应该是register类似内存 |
四、编程模型
opencl支持的编程模型有两种数据并行和任务并行,对应的详细描述如下:
| 关键字 | 释义 |
|---|---|
| data parallel | kernel对多个数据进行并行操作处理,相互数据见存在依赖性 |
| task parallel | kernel数据处理是独立相互间不存在依赖 |
对于data parallel 并行处理计算中数据同步是非常的必要的,opencl两种粒度方式的数据同步,对应的描述如下表:
| 名称 | 同步粒度 | 释义 |
|---|---|---|
| work-group 同步 | work-group内 | work-group内的所有work-iterms同步 |
| commands 同步(同一context) | 同一context下 | 基于同一context下的commands间的同步(1. 同一队列内同步,2. 基于event的数据同步) |
三、附录
3.1 名词解释
| 名字 | 释义 |
|---|---|
| OpenCL Platform layer | The platform layer allows the host program to discover OpenCL devices and their capabilities and to create contexts. |
| OpenCL Runtime | The runtime allows the host program to manipulate contexts once they have been created. |
| OpenCL Compiler | The OpenCL compiler creates program executables that contain OpenCL kernels. The OpenCL C programming language implemented by the compiler supports a subset of the ISO C99 language with extensions for parallelism. |
| 规约运算 | 对一个输入数组执行某种算子,产生更小结果的中间数组,该过程就是规约S |
3.2 OPENCL UML类图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OodV9Tny-1617343931196)(D:\work\文档\openclUml.png)]
| 符号 | 释义 |
|---|---|
| * | 多个 |
| 0…1 | 没有或者有一个 |
| 1…* | 一个或者多个 |
| -> | 相互指导关系 |
连线双端表示相互间的数据映射关系和UML的逻辑关系,但是“->”不代表连线双端存在关系只是双端间的指导关系。
参考文档: opencl-1.2.pdf
版权声明:本文为zy562760942原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。