OpenCL架构

1. 简介


OpenCL(Open Computing Language),即开放运算语言,是一个统一的开放式的开发平台。OpenCL是首个提出的并行开发的开放式的、兼容的、免费的标准,它的目的是为异构系统通用提供统一开发平台。OpenCL最初是由苹果公司设想和开发,并在与AMD,IBM,英特尔和NVIDIA技术团队的合作之下初步完善。随后,苹果将这一草案提交至Khronos Group。


OpenCL历史版本.png

2. 框架组成


OpenCL的框架组成可以划分为三个部分,分别为OpenCL平台API、OpenCL运行时API,以及OpenCL内核编程语言。

2.1 平台API

平台(Platform)这个词在OpenCL中拥有非常特定的含义,它表示的是宿主机、OpenCL设备和OpenCL框架的组合。多个OpenCL平台可以共存于一台异构计算机。举个例子,CPU开发人员和GPU开发人员可以在同一个系统上分别定义自己的OpenCL框架。这时就需要一种方法来查询系统中可用的OpenCL 框架,哪些OpenCL设备是可用的,以及这些OpenCL设备的特性。相当于CUDA的主机和设备之间的关系
此外,为了形成一个给定的OpenCL应用平台,还需要对这些框架和设备所属的子集进行控制。这些功能都是由OpenCL平台API中的函数来解决的。此外,平台API还提供了为OpenCL创建上下文的函数。OpenCL的上下文规定了OpenCL应用程序的打开方式(相当是CUDA中核函数的调用),这可以在宿主机程序代码中得到验证。

2.2 运行时API

平台API提供函数创建好上下文之后,运行时API主要提供使用上下文提供的功能满足各种应用需求的函数。这是一个规模庞大且内容十分复杂的函数集。运行时API的第一个任务是创建一个命令队列。命令队列与设备相关联,而且一个上下文中可以同时存在多个活动的命令队列。有了命令队列,就可以通过调用运行时API提供的函数来进行内存对象的定义以及管理内存中的对象所依赖的所有其他对象。以上是内存对象的持有操作,另外还有释放操作,也是由运行时API提供的。
此外,运行时API还提供了创建动态库所需要的程序对象的函数,正是这些动态库实现了Kernel的定义。最后,运行时层的函数会发出与命令队列交互的命令。此外,管理数据共享和对内核的执行加以限制同步点也是由运行时API处理的。

2.3 内核编程语言

内核编程语言是用于编写OpenCL内核代码的。除了宿主机程序之外,内核程序也十分重要,它负责完成OpenCL中的实际工作。在部分OpenCL实现中用户可以跟其他语言编写的原生内核实现交互,但多数情况下内核是需要用户使用内核编程语言编写实现的。OpenCLC编程语言就是OpenCL中的内核编程语言,该编程语言是“ISO C99 标准”的一个扩展子集,也就是说它是由 ISO C99语言派生而来的。现在的OpenCL2.1还支持C++,是基于eISO/IEC JTC1 SC22 WG21 N3690(C++14)。

2.4 适合平台

  1. AMD
    根据AMD官网所提供的内容,OpenCL在AMD显卡中只能适用X86核心的CPU架构,而对其他PowerPC和ARM架构则不适用;并且也不是所有的AMD显卡都能运行OpenCL,按其官网介绍只能是AMD Radeon、AMD FirePro和AMD Firestream三种类型的显卡;但对于操作系统则可以是Linux或Windows的系统,如表1所示。
    表 1 AMD OpenCL
CPU架构 显卡类型 操作系统 系统位数
X86 AMD Radeon Linux/ Windows 32/64
AMD FirePro Linux/ Windows 32/64
AMD Firestream Linux/ Windows 32/64
  1. NVIDIA
    NVIDIA OpenCL是一种运行于具有CUDA能力GPU上的一种底层API,即OpenCL是运行于CUDA之上的一种API,从而若适用CUDA的平台,也同样适用OpenCL。根据NVIDIA官网最新版本的CUDA
    7.5适合的平台如表 2所示。
    表 2 NVIDIA OpenCL
操作系统 CPU架构 Distribution
Windows X86_64 10、8.1、7、Server 2012 R2、Server 2008 R2
Linux X86_64 Fedora、OpenSUSE、RHEL、CentOS、SLES、steamOS、Ubuntu.
ppc64le Ubuntu
Mac OSX x86_64 10.11、10.10、10.9

3. 计算架构


OpenCL 的设计目标是为开发人员提供一套移植性强且高效运行的解决方案。为了更好的描述OpenCL设计的核心理念,Khronos Group官方将OpenCL的计算架构分解成四个模型,分别平台模型(Platform Model)、内存模型(Memory Model)、执行模型(Execution
Model)以及编程模型(Programming Model)。

3.1 平台模型(Platform Model)

从整体上来看,主机(host)端是负责掌管整个运算的所有计算资源,因此OpenCL 应用程序首先是由主机端开始,然后由程序将各个计算命令从主机端发送给每个 GPU 设备处理单元,运行完毕之后最后由主机端结束。

OpenCL架构的平台模型.png

平台模型如图 16所示。从图中可以直观的看到,最基本处理单位是Processing Element,简称PE(处理单元),而一个或多个PE组成了Compute Unit,简称CU(计算单元),进而一个或多个CU就组成了Compute Device,即OpenCL设备。最后,一个或多个OpenCL设备连接到主机,并等待着处理主机发送的计算指令,由于PE是最基本处理单位,因此每条计算指令最终都归PE进行处理,而PE是在CU中的。

3.2 内存模型(Memory Model)

OpenCL将内核程序中用到的内存分为图 17所示的四种不同的类型。


OpenCL内存模型.png

其中它们的读写特性分别为:

  • Global memory:
    工作区内的所有工作节点都可以自由的读写其中的任何数据。OpenCL
    C语言提供了全局缓存(Global buffer)的内建函数。
  • Constant memory:
    工作区内的所有工作节点可以读取其中的任何数据但不可以对数据内容进行更改,在内核程序的执行过程中保持不变。主机端负责分配和初始化常量缓存(Constant buffer)。
  • Local memory:
    只有同一工作组中的工作节点才可以对该类内存进行读写操作。它既可以为 OpenCL的执行分配一块私有内存空间,也可以直接将其映射到一块全局缓存(Global buffer)上。特点是运行速度快。
  • Private memory:
    只有当前的工作节点能对该内存进行访问和读写操作。一个工作节点内部的私有缓存(Private buffer)对其他节点来说是不可见的。
    表 3 OpenCL各种存储器的分配方式和访问权限
存储器类型 主机 内核
分配方式 访问权限 分配方式 访问权限
Global 动态分配 可读、可写 不可分配 可读、可写
Constant 动态分配 可读、可写 静态分配 只读
Local 动态分配 不可访问 静态分配 可读、可写
Private 不可分配 不可访问 静态分配 可读、可写

3.3 执行模型(Execution Model)

OpenCL的执行模型是应用程序通过主机端对OpenCL设备端上的内核程序进行管理,该模型分为两个模块:一个是在主机端执行的管理程序,也称为Hostprogram,另一个是主机端的Hostprogram所管理的在OpenCL上执行的程序,也被称作Kernels。在执行Kernels前,先要建立一个索引空间,来对设备里的每个节点进行标识,每个节点都将执行相同的kernel程序。在每个工作组中,都有一个局ID,每个节点在全局里还有个全局ID,OpenCL使用NDRange来定义这个索引空间。

OpenCL执行模型.png

如图 18所示的OpenCL执行模型,其过程可以细分为如下的步骤完成:

  1. 查询连接主机上的OpenCL设备;
  2. 创建一个关联到OpenCL设备的context;
  3. 在关联的设备上创建可执行程序;
  4. 从程序池中选择kernel程序;
  5. 从主机或设备上创建存储单元;
  6. 如果需要将主机的数据复制到OpenCL设备上的存储单元上;
  7. 执行kernel程序执行;
  8. 从OpenCL设备上复制结果到主机上。

3.4 编程模型(Programming Model)

OpenCL支持两种编程模型,分别为数据并行编程模型和任务并行编程模型,并支持上面由这两种编程模型混合的混合编程模型。

  1. 数据并行编程模型
    OpenCL提供一个分层的数据并行编程模型,即典型的SIMD计算模型,其特点是每个数据经由同样的指令序列处理,而处理数据的次序是不确定的,并且每个数据的处理是不相干的,即任一线程的计算不得依赖于其它线程的结果(包括中间结果)。
  2. 任务并行编程模型
    任务并行模型中的每个内核是在一个独立的索引空间中执行的,也就是说,执行内核的计算机单元内只有一个工作组,其中只有一个工作项。在这样的模型中,每个线程都可以执行不同的带啊,着相当于MIMD的计算模型,适合多核心CPU。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容

  • 1. 简介 官网在这里 OpenCL(Open Computing Language),即开放运算语言,是一个统一...
    王侦阅读 1,854评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,660评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,167评论 25 707
  • 暮落之夜阅读 213评论 2 1
  • 今天和闺蜜聊了很多她相亲的趣事,有个很深的体会。你是怎么样的女子,就值得什么样的男生来追求。你的生活邋遢,事业懒惰...
    organnn阅读 364评论 1 2