将全局内存用于(大)本地/私有temp。 OpenCL中有效的数据结构

时间:2011-09-08 00:32:54

标签: qt memory-management opencl

我正在OpenCL中编写一个算法,它只需要暂时(在执行期间)需要数据结构。这将足以超过大多数设备的本地或私有内存。所以我必须使用全局内存来获取这些数据。

我读到了OpenCL中不同的内存类型,我知道随机访问全局内存非常慢。在我的例子中,每个工作组访问全局内存中的不同地址,换句话说,我使用全局内存作为一种本地内存。

所以我现在问自己,如果设备“知道”我没有读取其他工作组/项目写的数据,那么内存访问会加速吗? __constant在内存访问机制方面究竟有什么影响?我可以滥用这个或类似的关键字吗?或者甚至有一个我忽略的问题的关键字/方法?

另一件事是:这个数据结构的内存只需要在设备的内存中分配;我不需要在主机中访问(甚至不初始化)它。有没有比将未初始化的阵列发送到设备更有效的方法呢?我使用QtOpenCL,它允许我传递一个主机初始化的基元向量,它在内部转换(host-)到缓冲区并在内核调用时发送到设备。所以我正在寻找一种QtOpenCL方式来做到这一点。 AFAIK,只能从内核中分配本地内存。 (将数组定义为__global时出错。)

提前致谢!

1 个答案:

答案 0 :(得分:0)

由于常量缓冲区大小通常相当小(例如我的GTX 580上的64kB,并且这个大小与所有与48kB本地内存类似的工作组共享),我认为使用常量缓冲区不是解决方案。我建议查看图像 - 在优化示例中经常使用这些图像 - 这些图像被缓存用于2D空间局部性,访问不需要合并。

顺便说一下,我在某处看到,在NVidia上使用某些编译器选项禁用L1缓存可以通过随机访问全局内存来提高性能。

对于第二个问题:我认为如果你没有传递任何CL_MEM_USE_HOST_PTRCL_MEM_ALLOC_HOST_PTRCL_MEM_COPY_HOST_PTR标志,主机上的内存就不会被分配,因此没有任何东西可以复制到设备。