OpenCL数据的传送与划分

选定一个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上。

原文地址:https://www.cnblogs.com/tcsong24/p/6535995.html