浅谈OpenCL四大模型之Execution Model
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相关推荐
- 浅谈Opencl四大模型之Platform model
Opencl是一种典型的异构架构,可以很好的实施并发性,为了简化并行计算复杂度以及兼容各个芯片差异性,opencl将其抽象为四大模型(Platform model, Execution model,M ...
- 浅谈Opencl四大模型之Programming Model
Opencl 平台模型解决了 硬件兼容问题,将各种硬件抽象成了模型:执行模型解决了opencl程序如何运行的问题:内存模型解决了opencl 内存管理 问题,而编程模型(programming mod ...
- 浅谈Opencl四大模型之Memory Model
运行模型(execution model)讲述了一个kernel怎么样在opencl平台运行,host喝kernel如何交互的,kernel代码如何编译的等等,但是没有涉及到opencl内存的管理方式 ...
- python模型保存save_浅谈keras保存模型中的save()和save_weights()区别
今天做了一个关于keras保存模型的实验,希望有助于大家了解keras保存模型的区别. 我们知道keras的模型一般保存为后缀名为h5的文件,比如final_model.h5.同样是h5文件用save ...
- 浅谈Java内存模型、并发、多线程
浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...
- 浅谈linux线程模型和线程切换
本文从linux中的进程.线程实现原理开始,扩展到linux线程模型,最后简单解释线程切换的成本. 刚开始学习,不一定对,好心人们快来指正我啊啊啊!!! linux中的进程与线程 首先明确进程与进程的 ...
- 浅谈DirectX的模型加载
浅谈DirectX的模型加载 xanxus - 2010年10月3日 - DirectX - 0 Comments 喜欢这篇文章吗?分享给你的朋友吧~ 基于DirectX的游戏开发中,人物和模型由针 ...
- YB菜菜的毫米波雷达自学之路(三)——浅谈雷达信号模型建立2
YB菜菜的毫米波雷达自学之路(三)--浅谈雷达信号模型建立2 前提说明 回顾与准备 1. 一维阵列下的雷达信号模型 1.1 单发射/波束合成模式下的一维阵列信号 1.1.1单发射天线(或BF)与波束合 ...
- 浅谈OpenCL之Platform API(1)
Platform API 为opencl 初始化首先要使用的API,主要是获取到platform 以及device. OpenCL Platforms opencl 应用程序第一步首先就是要查询ope ...
最新文章
- 组策略禁止自动锁定计算机,如何在Windows 10中禁用自动锁定
- Winform中设置ZedGraph鼠标悬浮显示线上的点的坐标并自定义显示的内容
- [USACO1.2]双重回文数 Dual Palindromes
- Redis 实战之主从复制、高可用、分布式
- 最近准备学习下mongodb(一 Windows安装篇)
- 京东发布“下一代智能协同开放平台”战略 助力政企数字化转型
- 在windows上搭建redis集群(Redis-Cluster)
- android sd卡挂载广播,Android--检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播...
- 用matlab开发软件开发,Matlab软件应用与开发new
- mysql 窗口函数_MySQL-窗函数
- Axure最新激活码
- 校友故事|我在科大感受理工科“严谨的浪漫主义”
- 回归分析中自变量取舍、检验及多重共线性处理(VIF)
- 班级网页制作 HTML个人网页设计 我的班级网站设计与实现 大学生简单班级静态HTML网页设计作品 DIV布局班级网页模板代码 DW学生校园网站制作成品下载
- 少有人走的路 - 读书笔记
- Lync 2010升级到2013之部署企业语音!
- 人民币(RMB)小写/数字转换大写工具类,精确到分,修复‘圆零零’为‘圆整’,修复科学计数法处理异常。
- jvm垃圾回收之垃圾收集器
- Android----在线点9图片制作
- Android 工具:Show GPU Overdraw
热门文章
- quartz中的corn表达式(转)
- Java并发编程(04):线程间通信,等待/通知机制
- Julia面向对象(多重派发)
- Servlet - 会话跟踪
- Socket编程实践(12) --UDP编程基础
- Linux 学习笔记_12_Windows与Linux文件共享服务_1.1_--Samba(下)Samba经典应用案例
- [LUOGU]P1451 求细胞数量
- RHEL6.2手动封装rpm源码包安装星际译王
- Vue.use自定义自己的全局组件
- Jackson 学习