OpenCL-1-编程四大模型介绍

本节介绍OpenCL的四个编程模型。编程

0.前言

  OPenCL做为开放性的异构计算的标准,支持的平台有CPU、GPU、DSP、FPGA。支持的设备如此不一样,那么须要对它们有一个统一的分层、模型划分,才能让各家更好的实现--平台模型、执行模型、内存模型、编程模型。数组

1.平台模型

  • OpenCL设备有两部分组成,宿主机和OpenCL设备异步

    • 宿主机负责总体流程控制,通常为CPU。
    • OpenCL设备主要负责数据运算操做。
  • OpenCL设备内部由多个计算单元(CU)组成,每个CU能够继续划分为处理单元(PU)。
  • 执行流程: 宿主机负责管理全部的OpenCL设备,宿主机发起计算任务,选择特定的OpenCL设备并创建计算环境。而后将计算任务和数据发送给OPenCL设备。设备调用内部计算单元进行计算,完成后将结果返还给宿主机,该次计算任务结束。

2.执行模型

2.1执行模型概念

  OPenCL是一个主从处理模型,根本是宿主机如何利用OpenCL设备上大量的计算资源进行有效计算。因此OpenCL执行模型的任务就是如何高效地调用这些计算资源函数

  • 宿主机将每个处理单元(PE)分配一个索引号,这个惟一的索引号称为全局ID(Global ID),全体PE被看作一个工做空间的work-item。
  • 由于咱们可能处理数组、图形乃至三维图像,因此对应的工做空间也能够定义为一维、二维、三维。
  • 为了更好的处理不一样的数据,咱们能够将工做空间进行粗粒度的划分,如将一部分ID划分到一组,这个组称为work-group,每个组内也能够分配ID,不过这个ID称为局部ID(Local ID)。全局ID和局部ID存在映射关系。
  • OpenCL规范中使用一个长度为N的整数数组来描述工做空间的大小(N<=3)。数组中的数值对应相应维度上工做点的个数。spa

    • 若是将咱们常见的三维魔方想象成一个工做空间,那么一维即为红色的一行,即一维个数为3,二维为红色那个面,二维个数为9,三维即为整个工做空间,三维个数为27。

魔方

2.2上下文

  计算工做主要在OpenCL设备上进行,但宿主机也扮演着很是重要的角色。宿主机主要经过上下文(Context)管理OpenCL设备。上下文指的是所管理硬件和软件资源,以下所示:指针

  • 设备:OpenCL程序调用的计算设备
  • 内核:在计算设备上执行的并行程序。
  • 程序对象:内核程序的源代码(.cl文件)和可执行文件。
  • 内存对象:计算设备执行OpenCL程序所需的变量。

上下文由宿主机使用API进行建立、管理、销毁。code

2.3命令队列

  宿主机主要经过命令对相应设备进行控制。根据计算量的大小,计算设备并不能马上执行完被分配的计算任务。那么宿主机只能等着计算设备把任务计算完了才能继续分配新的任务么?显然不是,每个计算设备都会有一个命令队列。命令队列只能管理一个计算设备。经过命令队列,就实现了宿主机和计算设备的异步控制与执行。对象

  队列中的命令主要有三种:索引

  • 启动命令:OpenCL设备开始执行内核程序。
  • 内存命令:在宿主机与内存设备之间移动数据,或者在二者之间进行内存映射。
  • 同步命令:约束命令在计算设备上的执行:队列

    • 乱序执行: 命令按照在命令队列中的顺序进行发射,但不保证计算设备是按照这个顺序进行执行的。
    • 有序执行: 命令按照在命令队列中的顺序进行发射和执行,上一条命令执行完成后才能发射下一条命令。

  宿主机程序能够为一个计算设备建立多个命令队列--一个计算设备能够有多个命令队列。这些命令队列没有关联。这也就意味着一个计算设备能够执行多个种类的任务,如小明能够在等待游戏加载的事件背几个英语单词 ~_~。

3.存储模型

  与通用计算程序的内存对象类似,OpenCL将设备中的存储器抽象成四层结构的存储模型:

  • 全局内存:工做空间中的全部节点均可以读写。(全局变量)
  • 全局变量:工做空间中的全部节点均可以读,但不能够写。(全局常量)
  • 本地内存:同一个工做组中的工做节点能够进行读写,对其余工做组不可见。不能经过宿主机进行初始化。(当前文件的全局变量)
  • 私有内存:只属于工做节点。(函数中的局部变量)

内存模型

在程序运行期间,须要宿主机和计算设备进行数据交换,存在两种方式:

  • 数据拷贝进行:将须要的数据拷贝到工做组空间,计算完成后再拷贝出去(传形参)
  • 内存映射:将须要计算数据的地址传进去(传指针)

4.编程模型

  前面已经提到计算的时候能够按照两种模型来进行计算:数据并行和任务并行。

  • 数据并行:将须要计算的数据进行等分,分配给不一样的计算设备进行计算。如须要进行两个很大矩阵的求和运算,那么就能够将矩阵数据分红几份,那么理论上计算事件缩减为原来的1/N。这适用与数据想关联不大的计算任务。
  • 任务并行:如计算数据量不大,但每个步骤先后依赖,如你必须先将水烧开才能下面条,若是你须要不断的煮面条,那么就能够将这个过程分红阶段,用好几个锅同时进行。具体细节参考工厂的流水线工做模式。

  既然有数据或任务的并行,那么同步就成为一个绕不开的节点。并行是指在计算设备执行内核的过程当中,对于其余的节点是绝对独立的,互不影响。OpenCL有三种方式进行同步:

  • 同一个work-group的节点间进行数据同步。
  • 同一个命令队列中的命令进行同步
  • 同一个上下文中的命令队列进行同步。

版权声明:本文为博主原创文章,转载需声明为转载内容并添加原文地址。

更多博主原创文章,请移步:

原文地址:http://coderdock.com

相关文章
相关标签/搜索