`
hzbook
  • 浏览: 259100 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OpenCL框架组成

 
阅读更多

OpenCL框架组成

本文主要讨论OpenCL框架,其组成可划分为以下三个部分:

  • OpenCL平台API:平台API定义了宿主机程序发现OpenCL设备所用的函数以及这些函数的功能,另外还定义了为OpenCL应用创建上下文的函数。
  • OpenCL运行时API:这个API管理上下文来创建命令队列以及运行时发生的其他操作。例如,将命令提交到命令队列的函数就来自OpenCL运行时API。
  • OpenCL编程语言:这是用来编写内核代码的编程语言。它基于ISO C99标准的一个扩展子集,因此通常称为OpenCL C编程语言。

在后面的小节中,我们将为以上各个部分提供一个高层的概述。详细内容留待本书后面介绍,不过使用OpenCL时先有一个高层认识会很有帮助。

1. 平台API

平台(platform)一词在OpenCL中有非常特定的含义。它表示宿主机、OpenCL设备和OpenCL框架的组合。一个异构计算机上可以同时存在多个OpenCL平台。例如,CPU开发商和GPU开发商可以在一个系统上分别定义自己的OpenCL框架。程序员需要一种方法查询系统中可用的OpenCL框架。他们需要查找哪些OpenCL设备可用,这些OpenCL设备有什么特性。另外,他们还需要控制这些框架和设备的哪个子集构成给定OpenCL应用中使用的平台。

这些功能由OpenCL平台API中的函数解决。在后面的章节中将会看到,我们重点讨论OpenCL程序员为宿主机程序编写代码时,每个OpenCL应用程序都以类似的方式打开,调用平台API的函数为OpenCL计算定义上下文。

2. 运行时API

平台API中的函数为OpenCL应用定义上下文。运行时API则强调使用这个上下文满足应用需求的函数。这是一个庞大而且确实相当复杂的函数集。

运行时API的第一个任务是建立命令队列。可以将命令队列关联到一个设备,不过一个上下文中可以同时有多个活动的命令队列。

有了命令队列,就可以使用运行时API来定义内存对象和管理内存对象所需要的所有其他对象(如对于图像对象还需要采样器对象)。管理内存对象是一个很重要的任务。为了支持垃圾回收,OpenCL会跟踪多少个内核实例使用这些对象(也就是说,持有一个内存对象),以及内核何时用完一个内存对象(即释放一个内存对象)。

运行时API管理的另一个任务是创建构建动态库所用的程序对象,内核就由这些动态库定义。程序对象、编译程序对象的编译器以及内核定义都在运行时层处理。

最后,与命令队列交互的命令都由运行时层的函数发出。管理数据共享和对内核执行施加约束的同步点也由运行时API处理。

可以看到,运行时API函数完成了宿主机程序的大部分具体工作。要想一次掌握运行时API,从第一个函数开始学完所有函数,这是很有压力的。我们发现,更好的做法是使用一种实用的方法。掌握真正要使用的函数。过一段时间,你就会把它们全面覆盖到,并完全掌握,不过要根据OpenCL应用的具体需要来学习这些函数。

3. 内核编程语言

宿主机程序非常重要,不过完成OpenCL中实际工作的是内核。有些OpenCL实现允许你与非OpenCL编写的原生内核交互,不过,大多数情况下都需要编写内核来完成应用中的特定工作。

OpenCL中的内核编程语言称为OpenCL C编程语言,因为我们希望过一段时间后可以定义符合规范的其他语言。它由ISO C99语言派生而来。

在OpenCL中,要对支持可移植性特别当心。这要求我们标准化不同类的OpenCL设备之间的最小公共子集。由于C99中有些特性只有CPU能够支持,所以在定义OpenCL C编程语言时,我们去掉了C99的一些语言特性。删除的主要语言特性包括:

  • 递归函数。
  • 函数指针。
  • 位域。

另外,我们不支持完整的标准库集合。OpenCL编程语言中不支持的标准头文件很多,不过程序员最有可能遗漏的是stdio.h和stdlib.h。再次说明,一旦不再将通用处理器作为OpenCL设备,这些库将很难获得支持。

由于需要保持OpenCL核心抽象的真实性,所以会带来另外一些限制。例如,OpenCL定义了一组内存地址空间。联合(union)或结构(structure)不能混合类型。另外,OpenCL还定义了一些不透明的类型,例如,支持图像的内存对象。OpenCL C编程语言除了允许将这些类型作为参数传递给函数外,不允许对它们做任何其他处理。

我们将OpenCL C编程语言限制为只满足用于OpenCL的关键OpenCL设备的需求。出于同样的原因,促使我们扩展语言以及以下方面:

  • 矢量类型和这些类型实例上的操作。
  • 地址空间限定符,支持OpenCL对多个地址空间的控制。
  • 一组丰富的内置函数,支持OpenCL应用中通常需要的功能。
  • 全局和局部内存中处理无符号整数和单精度标量变量的原子函数。

大多数编程语言忽略浮点算术系统的特定细节。它们只是从硬件导入算术系统,从而完全避开这个问题。由于所有主流CPU都支持IEEE 754和IEEE 854标准,所以这个策略是可行的。实际上,通过集中研究这些浮点标准,硬件开发商在为语言开发商解决浮点定义的有关问题。

不过,在异构世界中,如果脱离CPU,那么对浮点算术运算的支持会有更多的选择。过去通过与硬件开发商的紧密合作,我们希望大力推动他们完善对IEEE浮点标准的支持。与此同时,我们不希望对这些开发商过于苛刻,所以赋予他们一定的灵活性可以避开IEEE标准中一些不常使用但实现很困难的特性。后面会详细讨论有关细节,不过从高层可以总结为OpenCL需要以下特性:

  • 对IEEE 754格式的全面支持。双精度是可选的,不过如果提供双精度,也必须符合IEEE 754格式。
  • 支持默认的IEEE 754舍入模式,即“舍入为最近整数”。其他舍入模式尽管值得推荐(因为数值分析学者需要这些模式),但它们是可选的。
  • 尽管IEEE规范要求动态改变舍入模式,但OpenCL中的舍入模式是静态设置的。
  • 必须支持特殊值INF(无穷大)和NaN(非数字),不过不要求提示NaN(通常反映并发系统中的问题)。
  • 非规格化数(小于1的数乘以所支持的最大负指数)可以化简为0。如果你还不了解为什么这很重要,不用担心,很多人都与你一样。这也是数值分析学者很依赖但很少有程序员了解的另一个特性。

关于浮点数异常还有很多其他规则,不过它们对大多数人来说都过于复杂、过于深奥,没有必要在这里多做说明。关键是要了解我们已努力满足IEEE 754的大多数内容,同时省略了很少使用而且(在配有矢量单元的异构平台上)难以支持的一些特性。

OpenCL规范并不仅限于IEEE标准。在OpenCL规范中,还有一些表格详尽地定义了数学函数中允许的相对误差。要想了解所有这些错误确实难度很大,不过对于编写详细数值代码的程序员来说,定义这些错误是至关重要的。

综合以上浮点数需求、限制和扩展,就得到了一个非常适合当前异构平台的编程语言,随着这些平台中使用的处理器继续发展,并变得更为通用,OpenCL C编程语言也会随之发展。

4. 小结

我们已经介绍了核心OpenCL框架的基本组成。要单独地了解这些组成部分(我们介绍时就主要采用了这种方式)很重要。为了把这些单独的部分汇集起来,形成OpenCL的一个全景图,下面对应用在OpenCL框架中的基本工作流做个小结,如图1-9所示。


图1-9 这个模块图总结了OpenCL的组成以及一个OpenCL应用执行期间在宿主机上发生的动作

首先是一个定义上下文的宿主机程序。图1-9中的上下文包含两个OpenCL设备、一个CPU和一个GPU。接下来定义了命令队列。这里有两个队列,一个是面向GPU的有序命令队列,另一个是面向CPU的乱序命令队列。然后宿主机程序定义一个程序对象,这个程序对象编译后将为两个OpenCL设备(CPU和GPU)生成内核。接下来宿主机程序定义程序所需的内存对象,并把它们映射到内核的参数。最后,宿主机程序将命令放入命令队列来执行这些内核。

-----------------------------

本文节选自《OpenCL编程指南》

原书名:OpenCL Programming Guide

作者:Aaftab Munshi / Benedict R. Gaster / Timothy G. Mattson / James Fung / Dan Ginsburg

本书由五位OpenCL核心设计人员携手打造,不仅详细而完整地解读了枯燥的OpenCL规范,而且通过一些重要的案例展示了如何利用OpenCL实现大量并行算法、编写复杂的并行程序、对OpenCL进行性能优化,以及探查硬件和针对硬件进行调整,是系统学习OpenCL的经典参考书。

阅读本书PDF样章,请访问http://download.csdn.net/detail/hzbooks/4791805

豆瓣收藏本书,请访问http://book.douban.com/subject/20385439/

分享到:
评论

相关推荐

    AMD OpenCL 中文版教程

    OpenCL由两部分组成,一是用于编写内核程序(在OpenCL设备上运行的代码) 的语 言,二是定义并控制平台的API。OpenCL提供了基于任务和基于数据两种并行计算机制,它极大地扩 展了GPU 的应用范围,使之不再局限于图形...

    Debugging OpenCL Kernels on GPU

    OpenCL 是一个跨平台的并行编程框架,用于开发高性能的计算应用程序。然而,在开发 OpenCL 应用程序时,调试是非常重要的一步骤。这篇文章将详细介绍如何在 GPU 上调试 OpenCL 核心,并提供了安装 OpenCL GPU 调试器...

    openCL规范文档

    OpenCL框架由平台层和运行时组成,其中平台层负责管理多个设备,运行时则负责具体的计算任务调度和执行。 四、平台层功能 平台层提供了查询平台和设备信息的能力,让开发者了解可用硬件资源,包括: 1. **查询...

    Opencl_openclVs2015_OpencL_

    OpenCL主要由三部分组成:主机API、设备API和内核语言。 2. **VS2015集成OpenCL**:在Visual Studio 2015中,开发者可以通过安装特定的OpenCL SDK和工具来支持OpenCL开发。这些SDK通常包含库文件、头文件以及编译和...

    OpenCL编程指南(opencl v1.1).zip

    OpenCL,全称为Open Computing Language,是一种开放标准的并行编程框架,主要设计用于异构计算平台,如CPU、GPU、FPGA以及嵌入式系统等。OpenCL V1.1是该规范的一个早期版本,虽然现在大多数设备已经支持更新的...

    OpenCL学习资料合辑(OpenCL编程指南,OpenCL中文教程(AMD),OpenCL编程入门)

    OpenCL,全称为Open Computing Language,是一种开放标准的并行编程框架,主要设计用于利用现代处理器的并行计算能力,包括CPU、GPU和其他异构计算设备。OpenCL提供了跨平台的编程接口,允许开发者编写高效的代码来...

    OpenCL_API.pdf

    OpenCL提供了一定程度的跨平台兼容性,但开发人员仍需留意不同平台和设备的限制,使用OpenCL框架提供的查询功能确保程序能够高效运行于目标硬件上。 以上是根据OpenCL_API.pdf文件内容提炼的关键知识点,详细学习和...

    OpenCL 中文文档

    OpenCL,全称为Open Computing Language,是一个开放标准的并行编程框架,主要设计用于异构计算平台,如CPU、GPU、FPGA等硬件设备。它提供了C语言风格的API,让开发者可以编写高效的代码,充分利用各种计算设备的...

    OpenCL中文入门完整教程

    ### OpenCL中文入门...通过以上知识点的总结,我们可以看到OpenCL不仅提供了一个强大的并行计算框架,还涉及到了GPU硬件架构、内存管理、线程调度等多个方面。掌握这些知识对于开发高效的并行计算应用程序至关重要。

    OpenCL异构编程模板

    OpenCL,全称Open Computing Language,是一种开放标准的并行编程框架,专为跨平台、多架构的并行计算设计。它允许开发者利用CPU、GPU、FPGA以及其它处理器进行高效计算,是实现硬件异构计算的重要工具。在本文中,...

    OpenCL内建函数中文手册.pdf

    OpenCL(Open Computing Language)是一种为异构平台编写程序的框架,这个框架允许软件开发人员在广泛的处理器上开发应用程序,包括CPU、GPU、DSP(数字信号处理器)和其他类型的处理器。OpenCL内建函数是OpenCL编程...

    opencl in action书源代码

    OpenCL,全称Open Computing Language,是一种开放标准的并行编程框架,主要用于跨平台的硬件加速计算,包括CPU、GPU和其他高性能计算设备。这本书通过实际的代码示例,帮助读者理解和掌握OpenCL的编程原理与实践。 ...

    opencl-2.0

    - **OpenCL框架(The OpenCL Framework)**:框架提供了不同版本OpenCL标准的混合支持,这允许在同一个平台上有不同版本的运行时环境共存。 ### OpenCL架构的关键组成部分 - **平台层(Platform Layer)**:负责...

    OPENCL最新规范文档version1.0.48

    总之,OpenCL版本1.0.48的规范文档全面而详细地介绍了OpenCL框架的核心概念和技术细节,为开发者提供了强大的工具来开发高性能的并行计算应用。通过遵循这些指南,开发者可以在各种硬件平台上实现高效、可扩展的并行...

    openCL模板工程

    OpenCL(Open Computing Language)是一种并行编程框架,用于利用CPU、GPU和其他处理单元进行高性能计算。这个"openCL模板工程"是基于OpenCL 17.1版本,并且已经配置了开发环境,即Visual Studio 2013。这个模板工程...

    gpu.rar_OpencL_opencl gpu

    OpenCL库是OpenCL框架的基础,包含了运行时环境、开发工具和驱动,使得开发者可以调用GPU的计算资源。 在压缩包的文件名列表中,我们可以看到以下内容: 1. README:通常是一个文本文件,包含有关压缩包内容的说明...

    OpenCL编程指南 源码

    OpenCL,全称为Open Computing Language,是Khronos Group推出的一种跨平台的并行计算框架。这个开源项目,"OpenCL编程指南源码",旨在帮助开发者深入理解OpenCL编程,通过源码学习如何在各种硬件平台上高效地利用...

    opencl 小程序

    OpenCL,全称Open Computing Language,是一种开放标准的并行编程框架,主要用于异构计算,如CPU、GPU、FPGA以及ASIC等硬件设备。它为开发者提供了一个统一的平台来编写高性能计算的应用程序,使得数据可以在不同...

Global site tag (gtag.js) - Google Analytics