OpenCL简介
开放计算语言(Open Computing Language, OpenCL)是非盈利技术联盟Khronos Group管理的异构编程框架。该框架充分利用了CPU、DSP、FPGA、GPU的计算能力。OpenCL支持多层次的并行,可以高效的映射到同构或异构的体系结构上。
OpenCL标准
OpenCL API是按照C 的,由C和C++封装而成,并且有很多第三方语言的绑定。这些语言包括Java、Python以及.NET等。OpenCL是C99语言的子集,并适当地扩展了在众多异构设备上执行数据并行代码的能力。
OpenCL和许多CPU并发编程模型一样,语法类似于标准的C函数,主要区别在于它拥有额外的一些关键字和OpenCL Kernel实现的执行模型。在OpenCL编程中,编程人员应该考虑的是如何细粒度地表示程序中的并行性。一个典型的OpenCL Kernel应该是这样的:
<span style="font-size:10px;">_kernel void vecadd(_global int *C, _global int *A, _global int *C)
{
int tid = get_global_id(0); //OpenCL intrisic function
C[tid] = A[tid] + B[tid];
}</span>
OpenCL规范
OpenCL规范由四个模块组成:
- 平台模型:定义了一个抽象的硬件模型,描述了宿主机和设备。供编程人员在上面编写在这些设备上执行的Kernel。
- 执行模型:定义了如何在宿主机上配置OpenCL环境以及如何在设备上执行Kernel。
- 内存模型:定义了Kernel中所使用的内存层次,无需考虑实际的底层架构。
- 编程模型:定义了如何将并发模型映射到物理硬件上。
平台模型
如下图描述,平台模型由一个宿主机以及一个或多个设备组成,一个设备可以分为多个CUs(Compute Units),一个CU又可以进一步划分为多个PEs(Processing Elements)。设备上的计算具体映射到了每个PE之上。
在平台模型中编程人员需要关注三种版本号:平台版本号、设备版本号、OpenCL支持版本号。
平台版本号表明了平台所支持的运行时功能,包括了Op