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

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

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

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

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

提前致谢!

【问题讨论】:

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

标签: qt memory-management opencl


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多