# 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](https://www.khronos.org/opencl)
