繁体   English   中英

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

[英]OpenCL, Is it possible write directly to local memory?

我是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错误。

如果我给NULL表示“ coeff”,则没有错误

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

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

谢谢

不可以,主机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, 
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM