浅谈Opencl四大模型之Programming Model
Opencl 平台模型解决了 硬件兼容问题,将各种硬件抽象成了模型;执行模型解决了opencl程序如何运行的问题;内存模型解决了opencl 内存管理 问题,而编程模型(programming model)解决的是如何将算法变为opencl程序问题。opencl四大模型是其主要利器,有效解决了并行编程的各种问题。
OpenCl编程模型主要包含数据并行(data parallelism)和任务并行(task parallism)两种模型。
Data-Parallel Programming Model
数据并行即为相同指令不同的数据,同时运行,是opencl支持的基本模式。下面以一个两个数组相乘简单例子说明:
假设 有数组A 和 数组 B,数组中A的每个元素乘以数组B的每个元素,一般程序编写的思路为
for (int index = 0; index < ArraySize; index++)
{Result[inxex] = A[index] * B[index];
}
利用循环对每个index 进行两个数组相乘,随ArraySize增大,其计算耗时越来越明显。
由于A和B之间的数据以及数组之内的数据在每个index都是相互独立, 数据在index之间都是相互独立的,每次执行的指令都是相同的(A[index] * B[index】),只是数据不同。
综上所述,我们可以增加并行度,即首先可以起两个线程,同时运行增加并行度,线程一计算前半部,线程二计算后半部,因此代码可以修改为:
Task 1:for (int index = 0; index < ArraySize/2; index++)
{Result[inxex] = A[index] * B[index];
}Task 2:for (int index = ArraySize/2; index < ArraySize; index++)
{Result[inxex] = A[index] * B[index];
}
将上述两个分开两个线程同时运行,其效率将增加一倍,继续增加线程,当线程增加到数目为数组大小ArraySize时,如下图所示:
则代码演进为:
Task 0:
Result[0] = A[0] * B[0];
Task 1:
Result[1] = A[1] * B[1];...
Task n:
Result[n] = A[n] * B[n];
每条线程执行的指令数目与 只启动一个线程相比运行的数目大大减少,其效率提高非常明显。(前提是 硬件支持 能够同时运行这么多线程),通过数据的并行度提高其效率将明显提升,上述过程是数据并行思路的来源。GPU本质上就是包括很多无数功能较少的CPU,来支持最大数据并行度。
数据并行是opencl的基础。由opencl执行模型可知,opencl执行的单位为work-item,在同一个work-group内,如果kernel 拥有较少分支或者无分支,则每个work-item运行的指令是完全相同的,且同时运行,但数据不同。
opencl为了区分每个work-item访问的数据,一般使用work-item Global ID作为index(类似与上面的Task ID),来区分不同的work-item对内存访问,防止出现内存一致性问题。
opencl仅支持同一work-group下的内存数据同步,申请的内存可以为local memory, 同步可以使用work-group barrier。
Task-Parallel Programming Model
opencl一般将数据并行作为算法转换的首选,当然也支持任务并行模式。
下图为一个任务并行的例子,将一个算法分解为1,2,3,...6步,任务之间假设是相互独立,数据也是独立,在串行世界中,将一次按照1,2,3,... 6进行运行。
在一个拥有3个PE模块下,可以将上述6个任务同时分到3个PE中同时运行,其并行度将增加到3。由于每个任务运行大小不同,其耗时也不相同。
在该例子中任务 1耗时比较长。当按照上述分配的第一种方案中, 1和3分布在一个PE中, 2和4 以及5和6分布分布在一个PE中,其运行耗时瓶颈将在任务1和3中。通过任务负载分担,合理规划,将1单独分布到一个PE中, 将4,5,2三个耗时较短分布在一个PE中,剩余的6和3分布在一个PE中,每个PE的耗时基本均等,其效率与第一种方案相比 将大大提高。
由上述可知,任务并行模型下,需要注意各个任务大小,可以通过合理load balancing来提高效率。
Opencl实现任务并行的三种方式:
1:Opencl 可以通过将一个kernel 单独分布在一个work-item来实现任务并行。
2:第二种方式时 入上述例子,当任务数超过 PE数量时,可以使用command-queue中的out-of-order命令,最任务进行调整。
3:第三种方式是使用event事件方法。
参考资料
《OpenCL programming Guide》
浅谈Opencl四大模型之Programming Model相关推荐
- 浅谈Opencl四大模型之Platform model
Opencl是一种典型的异构架构,可以很好的实施并发性,为了简化并行计算复杂度以及兼容各个芯片差异性,opencl将其抽象为四大模型(Platform model, Execution model,M ...
- 浅谈OpenCL四大模型之Execution Model
OpenCL执行模型(Execution Model)解释了opencl程序是如何运行的,是理解opencl的基础. OpenCL程序 Opencl应用程序一般分为host部分和kernel部分组成, ...
- 浅谈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之整体框架
结合四大模型,以CPU和GPU平台为例子,opencl整体框架如下: CPU为host端, GPU为device端, host和device端的交互是以context为主.context贯穿到整个op ...
最新文章
- kali下利用weeman进行网页钓鱼
- 数学系列 - 概率论 - 泊松分布和(负)指数分布
- xshell xftp使用
- 各国家分析之- 阿根廷与乌拉圭
- 互联网日报 | 6月15日 星期二 | 凯撒旅业拟换股吸并众信旅游;爱回收预计6月18日登陆纽交所;顺丰航空机队规模增至66架...
- 6.6.2赫夫曼编码
- 7-138 打印沙漏 (20 分)
- mark ubuntu 16.04 64bit + cpu only install mtcnn
- 纳德拉:微软正计划“终极移动设备”
- 快应用采坑与flex布局讲解
- PHP函数的引用传递(地址传递)
- Matlab中fread函数用法
- 计算机系统动态库修复,win10系统提示dll动态链接库出现故障修复的处理步骤
- 如何在金蝶服务器增加用户,详解金蝶KIS记账王如何新增用户
- 电机与拖动基础--第一章
- Win11切换桌面快捷键
- easyui filebox 上传类型控制
- Replacing TCP Wrappers in RHEL 8
- iOS图形编辑之Core Graphics
- 香港城市大学全奖PhD/联培PhD/博后/RA