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相关推荐

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

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

  2. 浅谈OpenCL四大模型之Execution Model

    OpenCL执行模型(Execution Model)解释了opencl程序是如何运行的,是理解opencl的基础. OpenCL程序 Opencl应用程序一般分为host部分和kernel部分组成, ...

  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之整体框架

    结合四大模型,以CPU和GPU平台为例子,opencl整体框架如下: CPU为host端, GPU为device端, host和device端的交互是以context为主.context贯穿到整个op ...

最新文章

  1. kali下利用weeman进行网页钓鱼
  2. 数学系列 - 概率论 - 泊松分布和(负)指数分布
  3. xshell xftp使用
  4. 各国家分析之- 阿根廷与乌拉圭
  5. 互联网日报 | 6月15日 星期二 | 凯撒旅业拟换股吸并众信旅游;爱回收预计6月18日登陆纽交所;顺丰航空机队规模增至66架...
  6. 6.6.2赫夫曼编码
  7. 7-138 打印沙漏 (20 分)
  8. mark ubuntu 16.04 64bit + cpu only install mtcnn
  9. 纳德拉:微软正计划“终极移动设备”
  10. 快应用采坑与flex布局讲解
  11. PHP函数的引用传递(地址传递)
  12. Matlab中fread函数用法
  13. 计算机系统动态库修复,win10系统提示dll动态链接库出现故障修复的处理步骤
  14. 如何在金蝶服务器增加用户,详解金蝶KIS记账王如何新增用户
  15. 电机与拖动基础--第一章
  16. Win11切换桌面快捷键
  17. easyui filebox 上传类型控制
  18. Replacing TCP Wrappers in RHEL 8
  19. iOS图形编辑之Core Graphics
  20. 香港城市大学全奖PhD/联培PhD/博后/RA

热门文章

  1. 中间件:ElasticSearch组件RestHighLevelClient用法详解
  2. centos 7 nginx_install.sh
  3. MYSQL GROUP BY 对多个字段进行分组
  4. webrtc在远程助手应用的实践
  5. iOS:苹果内购实践
  6. 用例设计工具PICT — 输入组合覆盖
  7. log4j.properties配置
  8. spring事务到底用于service层还是dao层
  9. .Net开源源码查询
  10. 正式开始liunx学习之旅