不等待事件的异步复制到 OpenCL 中的全局内存
Asyncronous copy to Global memory in OpenCL without waiting for event
我在 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 循环,这使事情变得更加复杂。
我认为在这种情况下您不必(可以)做很多事情。我知道英特尔的 GPU 实现不会在全局写入时停滞,除非在写入后不久存在寄存器依赖性危险(例如,如果程序在写入后过早地重用该寄存器,它将停止,直到依赖性危险清除)。遗憾的是,您无法真正控制寄存器分配,甚至不幸地看到它。
我在 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 循环,这使事情变得更加复杂。
我认为在这种情况下您不必(可以)做很多事情。我知道英特尔的 GPU 实现不会在全局写入时停滞,除非在写入后不久存在寄存器依赖性危险(例如,如果程序在写入后过早地重用该寄存器,它将停止,直到依赖性危险清除)。遗憾的是,您无法真正控制寄存器分配,甚至不幸地看到它。