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

如何将char指针传递到opencl内核?,opencl,Opencl,我试图将一个char指针作为 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 voi

我试图将一个char指针作为

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指向的内存位置。 任何帮助都会大有裨益

蒂纳克斯,
Piyus

您在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)
并在内核中用
\uuu global
(或
\uu constant
)限定符声明参数。然后,您可以使用
clenqueureadbuffer
将数据复制回主机

如果您确实知道主机和设备共享相同的物理内存,那么您可以通过使用
CL\u MEM\u ALLOC\u host\u PTR
标志创建缓冲区,并在希望从主机访问数据时使用
clenqueumpmemobject
来分配主机和设备都可见的内存。OpenCL2.0的新共享虚拟内存(SVM)功能还改进了在统一内存体系结构上主机和设备之间共享缓冲区的方式