从openCL中的向量类型内存返回值?

从openCL中的向量类型内存返回值?,opencl,Opencl,我试图在OpenCL代码中使用向量。在此之前,我将内存映射为 cmDevSrc= clCreateBuffer(cxGPUContext,CL_MEM_READ_WRITE,sizeof(cl_char) * (row_info->width) * bpp,NULL,&ciErr); cmDevDest=clCreateBuffer(cxGPUContext,CL_MEM_READ_WRITE,sizeof(cl_char) * (row_info->width) * bpp

我试图在OpenCL代码中使用向量。在此之前,我将内存映射为

cmDevSrc= clCreateBuffer(cxGPUContext,CL_MEM_READ_WRITE,sizeof(cl_char) * (row_info->width) * bpp,NULL,&ciErr);
cmDevDest=clCreateBuffer(cxGPUContext,CL_MEM_READ_WRITE,sizeof(cl_char) * (row_info->width) * bpp,NULL,&ciErr);
我正在使用
cmDevSrc
作为我的
未签名字符的源数组
cmddevtest
作为目标。 当我尝试使用向量实现相同的函数时,我将内核参数传递为

clSetKernelArg(ckKernel,1,sizeof(cl_uchar4 )*row_info->rowbytes*bpp,&cmDevDest); 
cmDevDest
cl\uchar4 cmDevDest
。 但是现在,我无法使用映射读取数据,出现以下错误

incompatible type for argument 2 of ‘clEnqueueMapBuffer’ 
/usr/include/CL/cl.h:1066: note: expected ‘cl_mem’ but argument is of type ‘cl_uchar4’
我现在还不知道还有什么方法可以解决这个编译时错误,我正在网上搜索,但任何帮助都会非常有用

谢谢
Piyush

函数
clCreateBuffer
返回一个
cl\u mem
对象,而不是
cl\u uchar4
(或任何其他内容),因此
cmDevSrc
cmDevDest
应声明为
cl\u mem
变量。这也是导致调用
clEnqueueMapBuffer
时出现编译器错误的原因

此外,传递内存对象参数时,
clSetKernelArg
arg\u size
参数应为
sizeof(cl\u mem)
,而不是缓冲区的大小:

clSetKernelArg(ckKernel, 1, sizeof(cl_mem), &cmDevDest);

所讨论的内核参数是
cl\u uchar4
还是
\u全局cl\u uchar4*
?如果是前者,则不应使用
clCreateBuffer
clCreateBuffer
返回一个
cl\u mem
,这就是为什么会出现编译器错误。这是声明
cl\u uchar4 cmDevDest我将其设置为
clSetKernelArg(ckKernel,1,sizeof(cl\u uchar4)*行信息->行字节*bpp,&cmDevDest)我不知道如何为向量分配内存,传递是在内核中。请纠正我。内核源代码中的声明是什么?@jprice
\uuuu global uchar4*out
U r correct,但我想在内核中使用向量,所以我需要传递一些可以容纳向量的东西,所以我按照我说的方式传递。现在它工作正常,但我不知道如何从
uchar
读回,这就是问题所在…@PiyushKumar
cl\u mem
可以保存向量-它只是一块没有任何类型的内存。如何在内核中使用它取决于您,将其解释为向量类型的数组是很好的。不管您在内核中如何使用它,您总是以我在上面展示的方式(使用
sizeof(cl_mem)
)将它传递给
clSetKernelArg
。@PiyushKumar您可以使用
clenqueueradbuffer
clEnqueueMapBuffer
以与非向量类型完全相同的方式读取数据。如果您对此有具体问题,请更新您的问题的详细信息,我会相应地更新我的答案。谢谢。如果你能告诉我是否可以在内核中使用任何静态变量,它也会起作用