#第三章 程序模型
第二章介绍的都是与加速平台和设备有关的内容,当你的加速设备固定的时候,每次初始化的结果都是一样的,所以实际上每次对于平台的初始化过程都是一样的那几步,只需要照葫芦画瓢就好,后面所说的其实还是按照一定的流程,只是细节上会根据程序的不同有所差别。
OpenCL的程序分为两个部分,第一部分是主机程序,用C\C++编写的用于在主机(电脑)端执行的程序,第二部分是内核程序,用类C语言编写,用于在设备端执行,这种程序一般以.cl为后缀名,下面就介绍一下主机端怎么去调用内核端的程序文件。
#####首先不管文件内容,先看主机端如何调用:
cl_program clCreateProgramWithSource (cl_context context, //执行程序的设备所在的上下文
cl_uint count, //程序文件的个数(可能有多个.cl文件)
const char **strings, //程序文件的内容字符串列表
const size_t *lengths, //每个程序文件的长度组成的列表
cl_int *errcode_ret) //错误指示代码
通过函数名可以知道该接口是通过直接读取程序文件来创建程序对象,一个工程可能会用到多个.cl程序文件,因此可以同时根据多个程序文件来创建我们的程序对象,程序对象的类型是cl_program,与设备对象平台对象一样,该类型的变量存放了程序的相关信息。
cl_program clCreateProgramWithBinary (cl_context context, //执行程序的设备所在的上下文
cl_uint num_devices, //目标设备的数量
const cl_device_id *device_list, //目标设备ID列表
const size_t *lengths, //二进制文件长度列表
const unsigned char **binaries, //二进制文件内容字符串列表
cl_int *binary_status, //每个二进制文件创建程序的状态列表
cl_int *errcode_ret) //错误指示代码
有些平台设备例如FPGA是不支持源码创建程序的,一般这种平台都会提供独立的编译工具,将程序文件通过平台指定的编译程序编译后会生成特定格式的二进制文件,然后主机可以通过这些二进制文件创建程序对象。
cl_program clCreateProgramWithBuiltInKernels (cl_context context, //执行程序的设备所在的上下文
cl_uint num_devices, //目标设备的数量
const cl_device_id *device_list, //目标设备ID列表
const char *kerne