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错误。
如果我给出了" 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,
};
相关文章:
- 我在 IDA 或 dbg 或 olly 上看到的内存是否与我在 RAM 上实时加载的内存相同?
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- 本地分配的内存是否可以用于将来使用?
- 多次分配内存是否一次性需要更多时间?
- 删除矢量的尾部(通过擦除)内存是否有效
- 如何找出内存是否属于堆或堆栈
- C++:提升:托管共享内存是否需要信号量锁
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 检查内存是否在堆上
- C++内存 - 是否需要删除使用 'new' 创建的基元类型变量?
- 如果通过委托给“malloc”的重载“new[]”分配,“释放”内存是否安全
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 我的 265GB RAM 笔记本电脑上的内存是否超过 8GB
- 在动态内存分配中,在程序终止并且忘记释放内存后,该内存是否保持分配状态
- 这些二维数组(C++)的内存是否不足
- 如果我在 for 中声明一个对象,它的内存是否会在那之后被释放?
- 二进制搜索树(如何在插入时检查内存是否不足)
- 用new重新分配内存是否安全
- 在构造函数初始化列表中分配内存是否存在任何问题
- 内存映射内存是否可能