OpenCL执行模型(Execution Model)解释了opencl程序是如何运行的,是理解opencl的基础。

OpenCL程序

Opencl应用程序一般分为host部分和kernel部分组成,它与平台模型紧密联系。

Host部分的代码主要是运行在host,主要作用是对Opencl进行初始化,创建context以及命令通道,提交命令,copy数据到device上等功能。

Kernel部分代码是opencl代码核心,是opencl真正执行的部分,是在devices上进行运行的。

一般opencl应用程序的步骤:

1:首先利用host的API部分进行opencl初始化,获取到platform以及devices,通过指定kernel在哪个platform和devides上运行,创建相应的context,以及command-queue。

2:将相应的数据从host copy 到kernel中。

3:kernel 部分,实行数据计算。

4:将kernel计算结果copy到host中。

Kernel主要有两种方式:

OpenCL kernels: 采用类C编写,是opencl计算的代码核心,opencl kernel代码是在GPU上做编译,CPU以字符串的形式将代码提交到kernel,由kernel进行编译,所以opencl的编译错误一般只有在代码执行前先做编译,而不是直接在CPU上编译好。

Native Kernels:一般是采用第三方库。

work-group work-item

Opencl代码中一般都是由多个kernel,由host 按照命令提交的方式通知device执行具体的那个kernel函数,并将参数传递给kernel。由于opencl是数据并行,同一时刻会在PE上同时执行同一条kernel函数,只是数据不一样而已。相同时刻同时执行一条kernel,怎么区分那个PE上跑的是什么数据? opencl会为每个PE执行的kernel分配index, 用于区分相同函数不同的数据,为opencl抽象的最小可执行单位被称为work-item, 每个kernel执行时都会分配一个全局的work-intem index。

Opencl 将相同的kernel下的work-item,以相同数量的划分为work-group。也就是相同kernel下的work-group之间的work-item是相同的。opencl能够保证同一条 work-group下的work-item是并行的,但是不同的work-group下的不同work-item并不能保证并行,所以opencl只能够支持同一work-group的work-item的同步。

其次work-item大小的划分是和硬件相关的,每个芯片不一样。work-item和work-group可以和硬件很好的映射起来,这是opencl抽象模型的优势之一, work-item可以映射为GPU的PE, 每个GPU有多个CU,在同一个CU下面有多个PE。在CU里面有多个调度器,可以保证在该CU下的PE能够并行运行,故可以将work-item映射为PE, work-group映射为CU.

work-item和work-group可以支持1,2,3维度的,但是同一个kernel的work-item和work-group必须是相同维度,可以使用NDRange进行划分。

work-item和work-group计算公式如下:

我们使用一个二维讲解work-item和work-group的划分,g来代表work-item的 全局唯一global ID,x和y分别代表两个维度,work-item的 index为(,), G 代表work-item大小,则二维work-item大小(,Gy),用w代表 work-group index,W代表work-groups大小,则 work-group ID表示为(wx, wy), work-group大小为(Wx, Wy)。

同一个work-group下内wok-item数量表示为L, 则在每个work-item在work-group也有唯一的本地 index(local index),有l表示,则

Lx = Gx/Wx

Ly = Gy/Wy

全局work-item的global ID与 本地worl-item的 local index,关系如下:

gx= wx * Lx + lx;

gy = wy * Ly + ly;

local ID 与 work-group ID表示为如下:

wx = gx /Lx

wy = gy/Ly

lx = gx % Lx;

ly = gy % Ly;

Context

Context在opencl中里面重要扮演重要角色,它是kernel和host沟通的桥梁,context是由host调用host API部分进行创建,用于指定host需要与那个device进行交互,因此创建context时需要指定device id, 用于创建该device 与host的沟通通道, 因此可以用于指定opencl kernel在具体哪个device执行。因此一般opencl host部分初始化程序,首先要遍历该平台下的platform,然后遍历该platform下的device,查找到需要使用的device id,然后创建该device 的context.

Program objects

Context只是解决了host与kernel交互问题,以及kernel在指定的device运行,并没有解决kernel代码是如何传递到kernel的问题,以及kernel的编译问题。一般opencl kernel代码是在host编写的,需要交由具体的硬件进行编译并运行,Opencl 通过根据context创建program object来解决此问题,在program中kernel代码以字符串的形式存在。

在opencl运行时,program通过context将上述代码以字符串的形式提交到GPU上做编译运行,opencl kernel代码也只能够在这个时间点做编译。当kernel较多时, program中kernel代码还可以写成专门写在以cl为后缀的文件中, program可以直接加载.cl文件。

Commnand-Queues

Program解决了host如何向device提交kernel代码,以及编译运行的问题,一般kernel代码里面就有多个kernel函数,program无法解决具体要执行什么时候执行哪条kernel函数。command-queue主要是用来解决上述问题,它是由host进行创建,是命令队列,当host决定要执行哪条命令时,提交命令到command-queue等待被执行, GPU当执行完前一条命令之后从commnad-queue取出待执行的下一条命令。opencl command主要分为三种类型:

Kernel execution commands:指明需要执行的kernel函数命令。

Memory command:进行host和device 数据传递,内存映射等。

syschronization command:为进行命令之间同步。

Command-queue按照执行顺序可分为In-order execution 和 Out-of-order exection.

In-order execution:执行顺序时按照host提交到command-queue的命令先后顺序,进行顺序执行。

Out-of-order exection:不按照host提交顺序进行执行,是乱序执行。

opencl默认是按照In-order进行执行。

参考资料

《OpenCL programming Guide》

浅谈OpenCL四大模型之Execution Model相关推荐

  1. 浅谈Opencl四大模型之Platform model

    Opencl是一种典型的异构架构,可以很好的实施并发性,为了简化并行计算复杂度以及兼容各个芯片差异性,opencl将其抽象为四大模型(Platform model, Execution model,M ...

  2. 浅谈Opencl四大模型之Programming Model

    Opencl 平台模型解决了 硬件兼容问题,将各种硬件抽象成了模型:执行模型解决了opencl程序如何运行的问题:内存模型解决了opencl 内存管理 问题,而编程模型(programming mod ...

  3. 浅谈Opencl四大模型之Memory Model

    运行模型(execution model)讲述了一个kernel怎么样在opencl平台运行,host喝kernel如何交互的,kernel代码如何编译的等等,但是没有涉及到opencl内存的管理方式 ...

  4. python模型保存save_浅谈keras保存模型中的save()和save_weights()区别

    今天做了一个关于keras保存模型的实验,希望有助于大家了解keras保存模型的区别. 我们知道keras的模型一般保存为后缀名为h5的文件,比如final_model.h5.同样是h5文件用save ...

  5. 浅谈Java内存模型、并发、多线程

    浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...

  6. 浅谈linux线程模型和线程切换

    本文从linux中的进程.线程实现原理开始,扩展到linux线程模型,最后简单解释线程切换的成本. 刚开始学习,不一定对,好心人们快来指正我啊啊啊!!! linux中的进程与线程 首先明确进程与进程的 ...

  7. 浅谈DirectX的模型加载

    浅谈DirectX的模型加载 xanxus - 2010年10月3日 - DirectX - 0 Comments 喜欢这篇文章吗?分享给你的朋友吧~  基于DirectX的游戏开发中,人物和模型由针 ...

  8. YB菜菜的毫米波雷达自学之路(三)——浅谈雷达信号模型建立2

    YB菜菜的毫米波雷达自学之路(三)--浅谈雷达信号模型建立2 前提说明 回顾与准备 1. 一维阵列下的雷达信号模型 1.1 单发射/波束合成模式下的一维阵列信号 1.1.1单发射天线(或BF)与波束合 ...

  9. 浅谈OpenCL之Platform API(1)

    Platform API 为opencl 初始化首先要使用的API,主要是获取到platform 以及device. OpenCL Platforms opencl 应用程序第一步首先就是要查询ope ...

最新文章

  1. 组策略禁止自动锁定计算机,如何在Windows 10中禁用自动锁定
  2. Winform中设置ZedGraph鼠标悬浮显示线上的点的坐标并自定义显示的内容
  3. [USACO1.2]双重回文数 Dual Palindromes
  4. Redis 实战之主从复制、高可用、分布式
  5. 最近准备学习下mongodb(一 Windows安装篇)
  6. 京东发布“下一代智能协同开放平台”战略 助力政企数字化转型
  7. 在windows上搭建redis集群(Redis-Cluster)
  8. android sd卡挂载广播,Android--检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播...
  9. 用matlab开发软件开发,Matlab软件应用与开发new
  10. mysql 窗口函数_MySQL-窗函数
  11. Axure最新激活码
  12. 校友故事|我在科大感受理工科“严谨的浪漫主义”
  13. 回归分析中自变量取舍、检验及多重共线性处理(VIF)
  14. 班级网页制作 HTML个人网页设计 我的班级网站设计与实现 大学生简单班级静态HTML网页设计作品 DIV布局班级网页模板代码 DW学生校园网站制作成品下载
  15. 少有人走的路 - 读书笔记
  16. Lync 2010升级到2013之部署企业语音!
  17. 人民币(RMB)小写/数字转换大写工具类,精确到分,修复‘圆零零’为‘圆整’,修复科学计数法处理异常。
  18. jvm垃圾回收之垃圾收集器
  19. Android----在线点9图片制作
  20. Android 工具:Show GPU Overdraw

热门文章

  1. quartz中的corn表达式(转)
  2. Java并发编程(04):线程间通信,等待/通知机制
  3. Julia面向对象(多重派发)
  4. Servlet - 会话跟踪
  5. Socket编程实践(12) --UDP编程基础
  6. Linux 学习笔记_12_Windows与Linux文件共享服务_1.1_--Samba(下)Samba经典应用案例
  7. [LUOGU]P1451 求细胞数量
  8. RHEL6.2手动封装rpm源码包安装星际译王
  9. Vue.use自定义自己的全局组件
  10. Jackson 学习