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

OpenCL, Is it possible write directly to local memory?

本文关键字:内存 是否 OPENCL      更新时间:2023-10-16

我是OpenCl的新手。现在,我试图了解本地和共享内存。我正在执行示例代码,在那里我正在尝试将大小4x4的过滤器从CPU上传到本地内存中,但是我会收到错误-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,则没有错误

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

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

谢谢

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

根据我的经验,用于图像处理的小过滤器通常在constant内存中更好 - 只需像全局内存那样分配缓冲区,但使用__constant而不是__global声明该参数。如果可能的话,您可能会通过将过滤器嵌入OpenCL内核来源作为编译时常数,例如:

,可以看到进一步的性能改进。
__constant float filter[] = {
  -0.000000f, -0.055556f, -0.055556f, 
  -0.055556f, -0.111111f, -0.222222f, 
  -0.222222f, -0.277778f, -0.444444f, 
};