我有一个在内核中编码的迭代过程。该过程涉及对全局缓冲区的不同位置的更新。
由于我无法在不同的工作组之间进行同步,我能想到的唯一策略是为每次迭代排队内核调用,并从主机检查结束条件(队列迭代,队列缓冲区读取以检查条件,队列)迭代,如果需要,等等......)
有没有更好的策略可循?
答案 0 :(得分:2)
一个非常好的策略(已经证明了我自己),是使用额外的内存,双缓冲方法。它快速且易于实施。
从给定位置(buffer1)读取的每次迭代,并写入另一个(buffer2)。 内核迭代完成后,交换buffer1和buffer2。如果需要,请“清理”将要接收数据的缓冲区(此次为buffer1)。继续。
为了检查来自CPU的结果,您可以对异步readBuffer进行排队。所以你正在读取buffer1的内容,而内核正在运行相同的数据。确保GPU始终处于忙碌状态。