OpenCL原理概况

8 篇文章 0 订阅

一、OpenCL简介

OpenCL全称Open Computing Language即开放计算语言。OpenCL为异构平台提供了一个编写程序,尤其是并行程序的开放的框架标准。OpenCL所支持的异构平台可由多核CPU、GPU或其他类型的处理器组成。
OpenCL由两部分组成,一是用于编写内核程序(在OpenCL设备上运行的代码) 的语言,二是定义并控制平台的API。OpenCL提供了基于任务和基于数据两种并行计算机制,它极大地扩展了GPU 的应用范围,使之不再局限于图形领域。
OpenCL由Khronos Group维护。Khronos Group是一个非盈利性技术组织,维护着多个开放的工业标准,例如OpenGL和OpenAL。这两个标准分别用于三维图形和计算机音频方面。OpenCL源程序既可以在多核CPU上也可以在GPU上编译执行,这大大提高了代码的性能和可移植性。OpenCL标准由相应的标准委员会制订,委员会的成员来自业界各个重要厂商。作为用户和程序员期待已久的东西,OpenCL带来两个重要变化:一个跨厂商的非专有软件解决方案;一个跨平台的异构框架以同时发挥系统中所有计算单元的能力。

二、OpenCL框架

OpenCL是一个用于异构平台上编程的开放性行业标准。这个平台可以包括 CPU GPU和其他各类计算设备,OpenCL会将各类计算设备组织成一个统一的平台。OpenCL不仅仅是一种编程语言,更是一个完整的并行编程框架,它包括编程语言,API,函数库以及运行时系统来支持软件在整个平台上的开发。

OpenCL框架可概括为:平台模型(Platform Model)、内存模型(Memory Model)、执行模型(Execution Model)、编程模型(Programming Model)。

1、平台模型(Platform Model)

这里写图片描述

平台模型如上图所示。由一个主机 (host)连接一个或多个 OpenCL设备构成。其中每个 OpenCL设备又可以分割成一个或多个计算单元 (CU),每个计算单元又可以进一步分割成一个或多个处理单元 (PE),各种计算操作都是在处理单元中完成的。所有由 OpenCL编写的应用程序都是从 host启动并在 host上结束的,host端管理着整个平台上的所有计算资源。应用程序会从host端向各个 OpenCL设备的处理单元发送计算命令。在一个计算单元内的所有处理单元会执行完全相同的一套指令流程。指令流可以是 SIMD模式或者SPMD模式。

2、内存模型(Memory Model)

这里写图片描述

OpenCL将内核程序中用到的内存分为了四类不同的类型:
全局内存 (global memory):
工作空间内所有的工作节点都可以读写此类内存中的任意元素。OpenCL C提供了缓存global buffer的内建函数。
常量内存 (constant memory):
工作空间内所有的工作节点可以只读此类内存中的任意元素。 host负责分配和初始化 constant buffer,在内核执行过程中保持不变。
局部内存 (local memory):
从属于一个工作组的内存,同一个工作组中所有的工作节点都可以共享使用该类内存。其实现既可以为OpenCL执行为其分配一块专有内存空间,也有可能直接将其映射到一块global buer上。
私有内存 (private memory):
只从属于当前的工作节点。一个工作节点内部的private buffer其他节点是完全不可见的。

这里写图片描述

OpenCL规定了两种方法来实现这一点:拷贝数据方法和内存映射方法。
拷贝数据是指host通过相应的OpenCL API将数据从host写入到OpenCL设备的内存中或者从 OpenCL设备内存读出数据到 host内存中。这种读写操作可能是异步的,OpenCL提供了阻塞式(block)模式和非阻塞式 (non-block)模式来处理读取操作。在 non-block模式下该API会在调度之后立即返回,在 block模式下 API会等待读写操作完成后才返回。
内存映射方法允许用户通过相应 OpenCLAPI将OpenCL的内存对象映射到 host端可见的内存地址空间中。映射之后用户就可以在 host端的映射地址读写该内存了,在读写完成之后用户必须使用对应 API解除这种映射关系。同拷贝内存方式一样,映射内存也分block和non-block模式。
OpenCL规定了一个较为宽松的内存模型,它不保证 kernel内每个工作节点所看到的所有内存状态和其他工作节点所看到的是一致的。它只规定在一个工作节点内部访问内存必须是一致的,在一个工作组内的所有工作节点在执行了工作组内存屏障函数后相应的 local buffer和global buffer必须是一致的。OpenCL不保证不同工作组之间的工作节点访问内存的一致性。

3、执行模型(Execution Model)

OpenCL的执行模型可以分为两部分,一部分是在 host上执行的主程序(host program),另一部分是在 OpenCL设备上执行的内核程序(kernels),OpenCL通过主程序来定义上下文并管理内核程序在OpenCL设备的执行。
OpenCL执行模型的核心工作就是管理 kernel在OpenCL设备上的运行。在 Host创建一个 kernel程序之前必须先为该 kernel创建一个标识了索引的工作空间,kernel会在工作空间每个节点 (workitem)上执行。该工作空间可以是一维,二维或者三维的。每个工作节点相应维度上的索引都被定义为节点在该维度上的全局 ID(global ID)。所有工作节点都将执行相同的 kernel程序,但是由于路径不同
计算出来的数据可以是不同的。OpenCL在了对工作空间提供了全局索引之外也提供了较小粒度的工作组(work group)空间。工作组的维度必须和整个工作空间的维度相同,并且整个工作空间在每个维度上都必须能等分成若干个工作区间。每个工作组在都有一个唯一的工作组 ID(work group ID),工作组内部的节点相对该工作组的位置索引被称作局部ID(local ID)。
OpenCL规范中使用 NDRang来定义 N-维索引空间。它由一个长度 为N的整数数组构成( N为1,2或3,对应一维二维或三维空间)该数组中的元素指定了工作空间每个维度的上工作节点的个数。工作节点的 global ID和local ID以及工作组ID都是N维,每个维度都是从0开始依次加1。

通过以下的例子进一步了解工作空间的结构:

这里写图片描述

给定一个二维工作空间 NDRang(Gx,Gy),对应工作组NDRang(Sx,Sy)。由于每个维度上工作空间都必须能恰好等分成若干个工作组,则要求 Gx必须为 Sx的整数倍,Gy必须为 Sy的整数倍。假设工作空间中一个节点的 global ID为(gx,gy),工作组 ID为(wx,wy),在该工作组内的local ID为(sx,sy)则作为工作空间内的有效节点,其 global ID, local ID, work-group ID必须满足:
这里写图片描述

4、编程模型(Programming Model)

OpenCL支持按数据并行的编程模型和按任务并行的编程模型,同时也支持由这两种混合而成的混合编程模型。其中按数据并行的模型在编 写OpenCL并行程序中最为经典。
数据并行模型是指同一系的列指令会作用在内存对象的不同元素上,即在不同内存元素上按这个指令序列定义了统一的运算。用户可以利用工作节点的 global ID或local ID来映射该工作节点所作用的内存元素。在一个严格意义上的数据并行的编程模型中,每个工作节点和该节点上 kernel程序所作用的内存之间都有着一对一的映射关系。OpenCL实现的是一个宽松的数据并行模型,并不要求一定要有严格的一对一映射。OpenCL提供了一种分级数据并行编程模型。其分级方式有两种方法,显示分级模型要求用户不仅要规定用于进行数据并行计算的所有工作节点的数目,同时也必须规定每个节点所属的工作组。而隐式分级模型则将后者交由OpenCL实现来管理。
任务并行编程模型是指工作空间内的每个工作节点在执行 kernel程序时相对于其他节点是绝对独立的。在这种模式下对每个工作节点都相当于工作在一个单一的计算单元内,该单元内只有单一工作组,该工作组中只有该节点本身在执行。

三、OpenCL执行流程图

这里写图片描述
这里写图片描述

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值