选定一个platform,创建上下文context。
context被成功创建好之后,CL的工作环境就等于被搭建出来了,CL_DEVICE_TYPE_ALL意味着把platform下所有连接这个context作为compute device。
为每个device创建commandQueue。command queue是每个device发送指令的信使。
cqueue[i] = clCreateCommandQueue(context, did[0], 0, 0);
进入真正在device run code的阶段:kernel函数的准备
cl_int clCreateKernelsInProgram(cl_program program, //成功创建执行的program对象 cl_uint num_kernels, //kernels指定地址的kernel数目 cl_kernel *kernels, //返回程序中内核对象的缓冲区地址。如果是NULL,则忽略。否则缓冲区的地址需要足够大以接收
cl_uint *num_kernels_ret) //程序中一共有多少kernel,如果是NULL,则忽略。
//给一个kernel的某些特定参数值赋值
cl_int clSetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value)
cl_mem clCreateBuffer(cl_context context, //一个有效的上下文 cl_mem_flags flags, //针对cl上的缓冲对象的一些设置 size_t size, //以byte为单位,对于buffer应该被开辟的空间 void *host_ptr, //一个指向之前被开辟的buffer数据的指针,buffer的空间必须>= size bytes cl_int *errcode_ret) //错误代码
这里要说明的是,cl计算的变量要位于device的存储上(例如显卡的显存),这样才能快起来,所以首先要把内存搬家,把这部分输入数据从hsot mem拷贝到device的mem上。