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