OpenCL,是否可以直接写入本地内存?

时间:2018-04-23 08:07:25

标签: c++ opencl

我是OpenCL的新手。现在我试图了解本地和共享内存。我正在做一个示例代码,在那里我试图从CPU上传一个大小为4x4的过滤器到本地内存,但是我得到错误-52 CL_INVALID_KERNEL_ARGS。示例代码:

void __kernel filter( const __global float* in, __global float* out, const __local float* coeff )
{
    //filtering
}

CPU部分:

ret = kernel.setArg(0, input);
ret = kernel.setArg(1, out);
ret = kernel.setArg(2, 16*sizeof(float), &coeff );

enqueueNDRangeKernel将返回-52错误。

如果我给出了“coeff”的NULL instaed,没有错误

ret = kernel.setArg(0, input);
ret = kernel.setArg(1, out);
ret = kernel.setArg(2, 16*sizeof(float), NULL );

是否可以直接写入本地内存?我在OpenCL书籍中找不到任何帮助。如果有人试过,请分享您的经验。

由于

1 个答案:

答案 0 :(得分:4)

不,主机CPU无法以这种方式直接访问本地内存。必须在设备上运行的内核中初始化所有本地内存分配。

根据我的经验,用于图像处理的小型过滤器通常在constant内存中更好 - 只需为全局内存分配缓冲区,但使用__constant而不是{{1}来声明参数}。如果可能,您可以通过将过滤器作为编译时常量嵌入到OpenCL内核源中来进一步提高性能,例如:

__global