OpenCL 创建Program对象|极客笔记
文章目录
- OpenCL标准
- 什么是OpenCL
OpenCL
全称为Open Computing Language(开放计算语言),先由Apple设计,后来交由Khronos Group维护,是异构平台并行编程的开放的标准,也是一个编程框架。
Khronos Group是一个非盈利性技术组织,维护着多个开放的工业标准,并且得到了业界的广泛支持。OpenCL的设计借鉴了CUDA的成功经验,并尽可能地支持多核CPU、GPU或其他加速器。
OpenCL不但支持数据并行,还支持任务并行。同时OpenCL内建了多GPU并行的支持。这使得OpenCL的应用范围比CUDA广。为了能适用于一些更低端的嵌入式设备(如DSP+单片机这种环境),OpenCL API基于纯C语言进行编写,所以OpenCL API的函数名比较长,参数也比较多(因为不支持函数重载),因此函数名相对难以熟记。不过,借助像Xcode、Visual Studio等现代化的集成开发环境,利用代码智能感知自动补全,其实开发人员也不需要刻意去死背OpenCL的API。
OpenCL覆盖的领域不但包括GPU,还包括其他的多种处理器芯片。到现在为止,支持OpenCL的硬件主要局限在CPU、GPU、DSP和FPGA上,目前在桌面端和服务器端提供OpenCL开发环境的主要有Apple、NVIDIA、AMD、ARM和Intel,其中Apple提供了一个独立的OpenCL框架并与自家的OSX系统完整地融合在一起;
NVIDIA和AMD都提供了基于自家GPU的OpenCL在Windows和Linux上的实现,而AMD和Intel提供了基于各自CPU在Windows和Linux上的OpenCL实现。目前除了OS X系统,NVDIA、AMD与Intel提供的OpenCL实现都不约而同地不支持自家产品以外的产品。由于硬件的不同,为了写出性能优异的代码,可能需要为不同的平台做相应的优化,这会对可移植性造成影响,这个需要权衡。
OpenCL包含两个部分
- 一是OpenCL C语言(OpenCL 2.1将开始使用OpenCL C++作为内核编程语言)和主机端API
-
二是硬件架构的抽象。
为了使C程序员能够方便简单地学习OpenCL,OpenCL只是给C11进行了非常小的扩展,以提供控制并行计算设备的API以及一些声明计算内核的能力。软件开发人员可以利用OpenCL开发并行程序,并且可获得比较好的在多种设备上运行的可移植性。
为了使得OpenCL程序能够在各种硬件平台上运行,OpenCL提供了一个硬件平台层。同时各种不同设备上的存储器并不相同,相应地,OpenCL提供了一个存储器抽象模型。与CUDA相似,OpenCL还提供了执行模型和编程模型。
OpenCL不但包括一门编程语言,还包括一个完整的并行编程框架,通过编程语言、API以及运行时系统来支持软件在整个平台上的运行。
相比CUDA,OpenCL的优点在于它提供了一种能够在不同平台上可移植的编程方式,另外其原生支持的多设备并行也是一大亮点。
OpenCL标准
OpenCL标准分为四部分,每一部分都用“模型”来定义。这里先简单的介绍一下,之后的章节中会进行详细的介绍:
平台模型
:指定一个host处理器,用于任务的调度。以及一个或多个device处理器,用于执行OpenCL任务(OpenCL C Kernel)。这里将硬件抽象成了对应的设备(host或device)。
执行模型
:定义了OpenCL在host上运行的环境应该如何配置,以及host如何指定设备执行某项工作。这里就包括host运行的环境,host-device交互的机制,以及配置内核时使用到的并发模型。并发模型定义了如何将算法分解成OpenCL工作项和工作组。
内核编程模型
:定义了并发模型如何映射到实际物理硬件。
内存模型
:定义了内存对象的类型,并且抽象了内存层次,这样内核就不用了解其使用内存的实际架构。其也包括内存排序的要求,并且选择性支持host和device的共享虚拟内存。
通常情况下,OpenCL实现的执行平台包括一个x86 CPU主处理器,和一个GPU设备作为加速器。主处理器会将内核放置在GPU上运行,并且发出指令让GPU按照某个特定的并行方式进行执行。内核使用到的内存数据都由编程者依据层级内存模型分配或开辟。运行时和驱动层会将抽象的内存区域映射到物理内存层面。最后,由GPU开辟硬件线程来对内核进行执行,并且将每个线程映射到对应的硬件单元上。这些模型的细节将会在之后进行详细的讨论。
什么是OpenCL
2008年,苹果公司向Khronos Group提交了一份关于跨平台计算框架的草案,该草案由苹果公司开发,并与AMD、IBM、Intel和NVIDIA公司合作逐步完善。这个跨平台计算框架就是OpenCL(Open Computing Language,开放计算语言)。2008年12月8日,OpenCL 1.0技术规范发布。2010年6月14日,OpenCL 1.1发布。2011年11月19日,OpenCL 1.2发布。2013年11月19日,OpenCL 2.0发布。
OpenCL是一个为异构并行计算平台编写程序的工业标准,此异构计算平台可映射到CPU、GPU、DSP和FPGA等计算设备。OpenCL提供了底层硬件结构的抽象模型,旨在提供一个通用的开放API,既减轻开发人员的编程难度,又让开发人员能够写出高效可移植代码。例如,使用OpenCL,开发人员可以编写在GPU上运行的通用计算程序,而无须将其算法映射到OpenGL或DirectX的3D图形API上。
为了描述OpenCL设计的核心,Khronos Group将OpenCL异构并行计算架构划分为:
- 平台模型(platform model)
- 存储器模型(memory model)
- 执行模型(execution model)
- 编程模型(programming model)
这些模型既相互独立,又相互联系,组成了OpenCL的有机整体。