1.8 使用OpenCL进行异构计算

读者们应该对并行原理和异构计算的背景有了一定的了解,下面我们来看看哪些特性在OpenCL中得到了支持。这里我们也来简单的回顾一下OpenCL的历史。

OpenCL是一个异构编程架构,其管理者是非盈利技术组织Khronos Group[3]。OpenCL是一个应用开发框架,在其框架下开发的应用,能够在不同的硬件供应商的设备上运行。第一版的OpenCL(1.0)标准在2008年正式发布,并出现在苹果Mac OSX雪豹系统当中。2009年,AMD宣布其旗下的显卡支持OpenCL。IBM也在该年宣布,其XL编译器在Power架构的处理器下支持OpenCL。2010年,Khronos Group发布了OpenCL 1.1标准。2011年,发布了OpenCL 1.2标准。本书的第一版介绍了很多OpenCL 1.2的特性。2013年,Khronos Group发布了OpenCL2.0标准,其包含如下新特性:

  • 嵌套并行化
  • 共享虚拟内存
  • 管道内存对象
  • C11原子操作
  • 增强图像支持

OpenCL支持多级别的并行化,能够将应用高效的映射到同构或异构、单独或多个CPU或GPU上,以及其他硬件供应商提供的硬件系统当中。OpenCL定义了一套“设备端-主机端”语言,主机作为对其他设备的管理者。设备端语言被设计用来映射内存系统和执行模型。主机端语言用较低的开销,为复杂的并发程序搭建任务管道。总的来说,就是提供了一种方法,让开发者能更高效的在OpenCL的环境下进行算法设计及实现。

OpenCL支持基于任务和基于数据的并行。OpenCL的内核类似于SPMD模型,内核就是并行单元(OpenCL称为工作项)中执行的实例,内核实例创建并入队后,会被映射到支持标量和矢量的硬件上运行。硬件平台供应商都在迅速的对OpenCL进行支持,将OpenCL标准中所提到相关内容在硬件层面上给予实现。有了这些供应商,就代表着OpenCL具有很大的市场价值,从手机端与嵌入式平台(ARM,Imageination,MediaTek,Texas Instrument),到桌面和高性能计算(AMD, Apple, Intel, NVIDIA和IBM)。更多架构的CPU已经支持OpenCL(包括X86, ARM和Power),以及以吞吐量和向量处理的著称的GPU,还有能细粒度并行的设备,比如FPGA(Alter, Xilinx)。更重要的是,OpenCL是跨平台、全行业支持的,其有良好的编程模型,值的开发者学习和使用。OpenCL将会在越来越多的地方是用到,并且使用和学习的门槛将越来越低。

OpenCL 2.0开始支持共享虚拟内存,后面的章节中会详细探讨。共享虚拟内存是一项很重要的特性,其对能减轻编程者的负担,特别是在类似APU这样使用统一物理内存的系统上。OpenCL 2.0也支持内存一致模型,提供“获取/释放”语义以缓解编程者在不明确的锁上耗费不必要的精力。支持共享内存通讯、管道,还有其他很多OpenCL 2.0的新特性将在后面的章节中一一详细介绍。


[3] Khronos Group, OpenCL, 2014. https://www.khronos.org/opencl