11.3 编译器的目标 —— OpenCL 2.0
CLamp开源包括以下组件:
C++ AMP
编译器:该项目由Clang和LLVM衍生而出,其编译器支持C++ AMP
作为C++
语言的扩展,并且内核代码使用OpenCL C或可移植的中间码表示。C++ AMP
头文件:由C++ AMP
标准定义的一系列头文件。其对一些OpenCL内置函数进行了包装,但是有些还是需要再认真的考虑一下。C++ AMP
运行时:用来连接主程序和内核的桥接库。连接可执行文件,其会加载和构建内核,设置内核参数和运行内核。
SPIR是LLVM中间码的一个子集,其用可用来表示OpenCL C程序。SPIR是可移植的,其没有具体设备的特征。其避免了让应用开发者只能通过加载文件的方式运行内核代码,否则开发人员就要管理不同设备上的内核版本。使用正确的SPIR中间码需要对应OpenCL平台支持cl_khr_spir扩展,并且有对应的SPIR版本(CL_DEVICE_SPIR_VERSIONS)。为了使用SPIR格式对程序对象进行编译,我们将使用clCreateProgramWithBinary()
。
SPIR有两个可用版本。SPIR 1.2可以对OpenCL C的1.2版本通过LLVM(3.2版)进行编码,并且SPIR 2.0可以对OpenCL C的2.0版本进行编码(LLVM版本要求较新)。这样,我们就将OpenCL C与SPIR联系起来。后面章节中,我们将使用具体的中间码对照相应的OpenCL C源码,以便让中间码具有更好的可读性。
基于向量相加的示例代码,剩余的章节将展示CLamp编译器重要的组件。与OpenCL无关的部分我们会省略,我们重点关注OpenCL是如何实现C++ AMP
主要特性。从中我们也能学习到如何使用OpenCL实现对应平台的C++ AMP
。