如何将char指针传递给opencl内核?

时间:2014-04-03 10:12:37

标签: opencl

我试图将一个char指针传递给opencl的内核函数

char *rp=(char*)malloc(something);
ciErr=clSetKernelArg(ckKernel,0,sizeof(cl_char* ),(char *)&rp)

我的内核是

__kernel void subFilter(char *rp)
{
    do something
}

当我运行内核时,我正在

error -48 in clsetkernelargs 1

另外,我尝试将内核修改为

__kernel void subFilter(__global char *rp)
{
    do something
}

我收到错误

error -38 in clsetkernelargs 1

表示无效的mem对象。

我只想访问内核中rp指向的内存位置。 任何帮助都会有很大的帮助。

Thnaks, PIYUSH

1 个答案:

答案 0 :(得分:3)

您在OpenCL内核中使用的任何数组和内存对象都需要通过OpenCL API进行分配(例如,使用clCreateBuffer)。这是因为主机和设备并不总是共享相同的物理内存。指向主机上分配的数据的指针(通过malloc)对于离散GPU来说绝对没有任何意义。

要将一个字符数组传递给OpenCL内核,您应该写下以下内容:

char *h_rp = (char*)malloc(length);
cl_mem d_rp = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, length, h_rp, &err);
err = clSetKernelArg(ckKernel, 0, sizeof(cl_mem), &d_rp)

并在内核中使用__global(或__constant)限定符声明参数。然后,您可以使用clEnqueueReadBuffer将数据复制回主机。

如果你 知道主机和设备共享相同的物理内存,那么你可以通过创建一个带有CL_MEM_ALLOC_HOST_PTR标志的缓冲区来分配对主机和设备都可见的内存,当您希望从主机访问数据时使用clEnqueueMapMemObject。 OpenCL 2.0的新共享虚拟内存(SVM)功能还改进了在统一内存架构上共享主机和设备之间缓冲区的方式。