Kernel 对于跨工作组读取的迭代内核,什么是好的策略?

Kernel 对于跨工作组读取的迭代内核,什么是好的策略?,kernel,iteration,opencl,Kernel,Iteration,Opencl,我在内核中编写了一个迭代过程。该过程涉及全局缓冲区不同位置的更新 由于我无法在不同的工作组之间进行同步,我能想到的唯一策略是为每次迭代排队一次内核调用,并检查主机的结束条件(队列迭代、读取队列缓冲区以检查条件、根据需要排队迭代等) 有没有更好的策略可以遵循 一个非常好的策略(我已经证明了),就是使用额外的内存,一种双缓冲方法。它速度快,易于实现 每次迭代都从一个给定的位置(buffer1)读取,然后写入另一个位置(buffer2)。 内核迭代完成后,交换buffer1和buffer2。如果需要,

我在内核中编写了一个迭代过程。该过程涉及全局缓冲区不同位置的更新

由于我无法在不同的工作组之间进行同步,我能想到的唯一策略是为每次迭代排队一次内核调用,并检查主机的结束条件(队列迭代、读取队列缓冲区以检查条件、根据需要排队迭代等)

有没有更好的策略可以遵循

一个非常好的策略(我已经证明了),就是使用额外的内存,一种双缓冲方法。它速度快,易于实现

每次迭代都从一个给定的位置(buffer1)读取,然后写入另一个位置(buffer2)。 内核迭代完成后,交换buffer1和buffer2。如果需要,请“清理”将要接收数据的缓冲区(这次是buffer1)。然后继续


为了检查来自CPU的结果,可以将异步readBuffer排队。因此,当内核在相同的数据上运行时,您正在读取buffer1的内容。确保GPU始终处于繁忙状态。

这是实现设备范围同步的常用策略,据我所知,也是唯一正确的策略。无论如何,内核调用都非常便宜。但是,请发布您的代码(或者至少是伪代码),使您的问题更加明确。