新建一个OpenCL程序对象
OpenCL C代码(编写的代码在OpenCL设备上执行)称为程序(program), 是称为kernel的函数的集合,kernel是被调度安排到设备上运行的执行单位。
OpenCL程序在运行时通过调用一系列API进行编译,编译系统针对具体的设备进行优化。OpenCL应用程序能同时移植到AMD、NVIDIA以及Intel的设备上,则不需要对这些平台分别进行预编译。OpenCL软件仅链接到一个公共运行层(称ICD),所有平台特定的SDK通过一个动态库接口委托给某个厂商的运行时。
新建kernel的步骤如下。
1. OpenCL源代码以字符串形式存储。如果代码保存在文件中,则必须读到内存并存储为字符串数组。
2. 源代码通过调用clCreateProgramWithSource()转化为一个cl_program对象。
3. 然后,使用clBuildProgram()在多个支持OpenCL的设备上编译程序对象,如果出现编译错误,则报告错误信息。
程序准确的二进制表示因具体设备而异。在AMD运行时中,主要有两类设备:x86 CPU和GPU。对于x86 CPU,clBuildProgram()会产生x86指令并且能够直接在该设备上执行。对于GPU,首先新建AMD GPU中间语言(intermediate language, IL )以及表示单个work-item的高级中间语言,随之针对该架构进行实时编译,产生众所周知的ISA(即具体指令集架构上代码)。NVIDIA使用类似的方法,调用中间代码表示PTX。使用IL的优势在于允许GPU ISA 能够适应硬件架构的更新步伐。
构建过程的另外一个特点是有能力生成最终的二进制格式和多种中间表示并且序列化它们(例如,将它们写回到磁盘中)。和大多数对象一样,OpenCL提供返回程序对象信息的clGetProgramInfo()函数。带有CL_PROGRAM_BINARIES 标志的该函数能够返回clBuildProgram()针对厂商特定设备所产生的二进制代码。
除了clCreateProgramWithSource ()之外,OpenCL提供clCreateProgramWithBinary ()匹配设备列表的二进制列表。这个二进制列表是以前使用clGetProgramInfo()新建的。