OpenCL

OpenCL


2024年7月4日发(作者:)

OpenCL™

简介

这篇

OpenCL™

简介简要剖析了

OpenCL 1.0

的三个主要部分,并举了一个简单的代码实例。本文不是

OpenCL 1.0

的详细说明

书。若要详细了解

OpenCL

,包括官方规范和

OpenCL

头文件,请访问

Khronos OpenCL API

注册表。

OpenCL 1.0

剖析

OpenCL 1.0

规范由三个主要部分组成:语言规范、平台层

API

和运行时

API

语言规范描述了编写计算内核的语法和编程接口,该计算核心可在支持的加速器上运行,例如

AMD GPU

和多核

CPU

。所用语

言基于

ISO C99

子集。

C

语言被选择作为第一种

OpenCL

计算内核语言的基础,因为开发人员普遍通晓这种语言。为了在各种

平台上产生一致的结果,人们针对所有浮点运算以及一套丰富的内建函数对

IEEE 754

的数值精度进行了明确定义。开发人员可

以选择预编译他们的

OpenCL

计算内核或者让

OpenCL

运行时根据需要编译他们的内核。

平台层

API

使开发人员可以访问可查询系统设备数目和类型的运行时。然后开发人员可选择必要的计算设备并对它们进行初始

化,以正确运行它们的工作负荷。用于提交工作和请求数据转换的计算上下文和工作队列就是在这一层创建的。

最后,运行时

API

允许开发人员排队执行计算内核,并负责管理

OpenCL

系统中的计算和内存资源。

1

,下表简要描述了

OpenCL

的各个部分。

1 — OpenCL

剖析

语言规范

基于C语言的跨平台编程接口

带语言扩展的ISO C99子集—开发人员通晓

经明确定义的数值精度—围绕IEEE 754的行为,定义了最大误差

在线或离线编译及创建可执行计算内核

包括一套丰富的内建函数

平台层API

置于各种计算资源之上的硬件提取层

查询、选择及初始化计算设备

创建计算上下文和工作队列

运行时API

执行计算内核

管理调度、计算和内存资源

执行模型

OpenCL

不仅以

GPU

为目标,还以其他加速器为目标,例如多核

CPU

,其指定的计算内核类型灵活多样。计算内核可被视为

数据并行型,该类型可与

GPU

架构完美匹配,或者被视为任务并行型,该类型可与

CPU

架构完美匹配。

计算内核是可执行代码的基础单元,可被视为类似于

C

语言函数。此类内核可按顺序执行也可不按顺序执行,具体取决于排队

执行内核时传递给系统的参数。提供了一些事件,以便开发人员检查未完成内核执行请求和其他运行时请求。

在组织方面,某内核的执行域由一种

N

维计算域定义。这使系统可以了解用户希望运用内核的问题有多大。执行域中的每个元

素都是一个工作项,

OpenCL

提供将工作项组合成工作组的功能,以便用于同步和通讯用途。

内存模型

OpenCL

定义了一种多级内存模型,涉及从仅单独计算单元可见的私有内存到设备上的所有计算单元均可见的全局内存这一范

围内的各种内存。不同内存空间可重叠在一起,具体取决于实际的内存子系统。

OpenCL 1.0

定义了

4

种内存空间:私有、局部、常数和全局。表

2

,下表显示了

OpenCL

定义的内存层次结构图。

私有内存是仅供单一计算单元使用的内存。这与单一计算单元或单一

CPU

核心中的寄存器相似。

局部内存是供工作组中的工作项使用的内存。这与当前一代的

AMD GPU

上提供的局部数据共享相似。

常数内存是指在内核执行过程中可用来存储常数数据,供设备中的所有计算单元进行只读访问的内存。主机处理器负责分配和

初始化驻留在此内存空间内的存储对象。这与

AMD GPU

上提供的常数缓存相似。

最后,全局内存是一种可供设备上的所有计算单元使用的内存。这与

AMD GPU

上提供的片外

GPU

内存相似。

2 — OpenCL

内存模型

简单示例

矢量加法内核

下文所述为用

OpenCL

写成的简单矢量加法内核。您可以看出,此内核指定了三个内存对象,两个用于输入,即

a

b

,一个

用于输出,即

c

。这些为驻留在全局内存空间内的数据阵列。在此例中,执行此内核的计算单元获得了其独有的工作项

ID

,并

使用此

ID

a

b

读入合适的值,再将两者之和存储到

c

中,以此来完成矢量加法部分。

因此在此例中,我们会使用在线编译,上述代码将被存储在名为

program_source

的字符阵列中。

为了补充计算内核代码,下方所示为在主机处理器上运行的代码,用于:

打开OpenCL上下文,

获得并选择执行设备,

创建命令队列,以接受并执行内存请求,

分配OpenCL内存对象以掌握用于计算内核的输入和输出,

在线编译及构建计算内核代码,

建立参数和执行域,

开始执行计算内核,以及

收集结果。


发布者:admin,转转请注明出处:http://www.yc00.com/news/1720035638a2759732.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信