【问题标题】:Asyncronous copy to Global memory in OpenCL without waiting for event异步复制到 OpenCL 中的全局内存,无需等待事件
【发布时间】:2015-03-20 10:13:48
【问题描述】:

我有一个在 OpenCL 下运行的程序,在我在私有内存中执行计算之后,我想将它们写入全局内存。我对以后的结果没有用处 - 基本上我正在寻找一个内置的解决方案来异步从 __local 或 __private 内存写入全局内存。

我已经尝试过 async_work_group_copy 并且我注意到为了确保正确复制数据,我必须等待事件。对于我的卡 AMD HD7970,这与直接同步复制到全局内存相同。

是否有人在不等待事件或任何其他可行的替代方案的情况下对 async_work_group_copy 有任何经验?

for (...) {
//Calculate some results and copy to __local array src
event_t e = async_work_group_copy(dest, src, size, 0);
wait_group_events(1, &e);  //Can we safely skip this??
}

这里 src 是 __local,dest 是 __global。

我怀疑由于整个组的此功能必须相同,因此跳过等待事件可能不起作用,因为其他本地工作项可能尚未完成。这是在一个 for 循环中,这使事情变得更加复杂。

【问题讨论】:

  • 所以你的内核必须在复制后做更多的工作,而不是那些全局数据?
  • 是的。内核本质上是制造数据并将它们放入全局内存中。有一些输入数据,但在开始时读取一次。制造的数据不需要被计算消耗。我需要的任何数据都始终保存在私人内存中。

标签: parallel-processing opencl gpu


【解决方案1】:

我认为在这种情况下您无需(可以)做太多事情。我知道英特尔的 GPU 实现不会在全局写入时停止,除非在写入后不久存在寄存器依赖性危险(例如,如果程序在写入后过早地重用该寄存器,它将停止直到依赖性危险清除)。可悲的是,您无法真正控制寄存器分配,甚至不幸地看到它。

【讨论】:

  • 感谢您的回答。我认为您可能是正确的-我想做更多的挖掘工作,看看是否有任何聪明的方法可以做到这一点。很奇怪,没有办法对此进行优化,因为我原以为异步单向写入将是 GPU 算法的经典用例。
  • 经过一些实验,我得出的结论是,至少在规范的 AMD 实现中,异步副本和直接内存副本之间没有区别。再次感谢您抽出宝贵时间回复。
  • 我发现的一个重要发现——对于任何查看这个问题的人来说都是如此——是 async_work_group_copy 具有一个重要优势。事实证明,以 dest=src 的形式对全局内存进行分配复制会占用大量 VGPR,这会大大降低 GPU 占用率。所以总的来说,出于这个原因,使用 async_work_group_copy 会更好。
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多