Parallel processing 在不等待事件的情况下异步复制到OpenCL中的全局内存

Parallel processing 在不等待事件的情况下异步复制到OpenCL中的全局内存,parallel-processing,opencl,gpu,Parallel Processing,Opencl,Gpu,我有一个在OpenCL下运行的程序,在私有内存中执行计算后,我想将它们写入全局内存。我对以后的结果没有任何用处,本质上我在寻找一种内置的解决方案,从_本地或_私有内存异步写入全局内存 我已经尝试了async\u work\u group\u copy,我注意到为了确保正确复制数据,我必须等待事件。对于我的AMD HD7970卡,这与直接向全局内存进行同步复制是一样的 是否有人在不等待事件或任何其他可行的替代方案的情况下拥有异步工作组拷贝的经验 for (...) { //Calculate so

我有一个在OpenCL下运行的程序,在私有内存中执行计算后,我想将它们写入全局内存。我对以后的结果没有任何用处,本质上我在寻找一种内置的解决方案,从_本地或_私有内存异步写入全局内存

我已经尝试了async\u work\u group\u copy,我注意到为了确保正确复制数据,我必须等待事件。对于我的AMD HD7970卡,这与直接向全局内存进行同步复制是一样的

是否有人在不等待事件或任何其他可行的替代方案的情况下拥有异步工作组拷贝的经验

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是本地的,dest是全局的


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

我认为在这种情况下,你没有什么可以做的。我知道Intel的GPU实现不会在全局写入时暂停,除非写入后不久出现寄存器依赖性危险(例如,如果程序在写入后不久重用该寄存器,它将暂停,直到依赖性危险消除)。遗憾的是,您无法真正控制寄存器分配,甚至很不幸地看到它。

所以您的内核在复制之后必须做更多的工作,但不能使用全局数据?是的。内核实质上是制造数据并将其放入全局内存中。有一些输入数据,但在开始时只读取一次。计算不需要消耗制造的数据。我需要的任何数据都会一直保存在私人内存中。谢谢你的回答。我想你可能是对的,我想做更多的挖掘,看看是否有什么聪明的方法可以做到这一点。很奇怪,没有办法优化它,因为我认为异步单向写入将是GPU算法的经典用例。经过一些实验,我得出结论,异步拷贝和直接内存拷贝之间没有区别,至少在规范的AMD实现中是这样。再次感谢您花时间响应。一个重要的我的发现是,异步工作组拷贝提供了一个重要的优势。事实证明,以dest=src的形式将分配拷贝到全局内存会占用大量VGRP,这会大大降低GPU占用率。因此,总的来说,出于这个原因,最好使用异步工作组拷贝。