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

Posted

技术标签:

【中文标题】将全局内存用于(大)本地/私有温度。 OpenCL 中高效的数据结构【英文标题】:Use global memory for (big) local/private temp. data structure efficiently in OpenCL 【发布时间】:2011-09-08 00:32:53 【问题描述】:

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

我了解了 OpenCL 中的不同内存类型,我知道随机访问全局内存真的很慢。在我的例子中,每个工作组访问全局内存中的不同地址,也就是说,我将全局内存用作一种本地内存。

所以我现在问自己的是,如果设备“知道”我不读取另一个工作组/项目写入的数据,内存访问是否可以加快? __constant 在内存访问机制方面到底有什么作用?我可以滥用这个或类似的关键字吗?或者我忽略的问题是否有关键字/方法?

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

提前致谢!

【问题讨论】:

恐怕在你的情况下没有办法改善对全局内存的访问(尽管合并的内存访问和预取几乎可以完全隐藏延迟)。但是,您可以尝试将变量声明为本地变量,并让编译器决定将其中哪些变量移至全局内存。 【参考方案1】:

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

顺便说一句,我在某处看到,在 NVidia 上使用某些编译器选项禁用 L1 缓存可以使性能稍好一些,并且通常随机访问全局内存。

对于第二个问题:我认为如果您不传递任何CL_MEM_USE_HOST_PTRCL_MEM_ALLOC_HOST_PTRCL_MEM_COPY_HOST_PTR 标志,则主机上的内存未分配,因此无法将任何内容复制到设备。

【讨论】:

以上是关于将全局内存用于(大)本地/私有温度。 OpenCL 中高效的数据结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenCL 中使用本地内存?

带有 OpenCL 的 Intel HD 6000 本地内存带宽 [关闭]

OpenCL 中的私有内存是不是有最大限制?

OpenCL 中的全局内存是不是连续

OpenCL 中的最佳本地/全局工作量

为啥 Cuda/OpenCL 的全局内存中没有银行冲突?