【发布时间】:2011-09-08 00:32:53
【问题描述】:
我正在用 OpenCL 编写一个算法,它只需要一个临时的数据结构(在执行期间)。这将大到足以超过大多数设备的本地或私有内存。所以我必须为这些数据使用全局内存。
我了解了 OpenCL 中的不同内存类型,我知道随机访问全局内存真的很慢。在我的例子中,每个工作组访问全局内存中的不同地址,也就是说,我将全局内存用作一种本地内存。
所以我现在问自己的是,如果设备“知道”我不读取另一个工作组/项目写入的数据,内存访问是否可以加快? __constant 在内存访问机制方面到底有什么作用?我可以滥用这个或类似的关键字吗?或者我忽略的问题是否有关键字/方法?
另一件事是:这个数据结构的内存只需要分配在设备的内存中;我不需要在主机中访问(甚至不需要初始化)它。有没有比向设备发送未初始化的数组更有效的方法?我使用 QtOpenCL,它允许我传递一个主机初始化的原语向量,该向量在内部转换(主机)到缓冲区并在内核调用时发送到设备。所以我正在寻找一种 QtOpenCL 方式来做到这一点。 AFAIK,只能从内核中分配本地内存。 (将数组定义为 __global 时出现错误。)
提前致谢!
【问题讨论】:
-
恐怕在你的情况下没有办法改善对全局内存的访问(尽管合并的内存访问和预取几乎可以完全隐藏延迟)。但是,您可以尝试将变量声明为本地变量,并让编译器决定将其中哪些变量移至全局内存。
标签: qt memory-management opencl