C语言 OpenCL:内核之间的同步



所以我正在尝试做这样的事情:

在我的主机代码中,我有一个循环

for(int i = 0; i < params.maxIters; i++){
    launch1DKernel(kernel…)
}

在我的内核中,我有

__kernel k(__global int * i, …){
    somearray[i * size + offset] = some_val;
    if(get_global_id(0) == 0){
        (*i) = (*i) + 1;
    }
}

这似乎不是一个很好的理由,我想保证同一迭代的所有工作项共享 i。上面的代码并不能保证 i 不会被下一次迭代的工作项 0 所激怒。我说的对吗?

在 OpenCL 中,全局内存一致性仅在内核调用开始时保证。因此,如果一个工作项将值写入全局内存,则无法保证此新值对其他工作组中的工作项可见。但是,在下一次内核调用时,此新值对所有工作项可见,在您的示例中,这将是下一次迭代。

因此,是的,*i值将按下一个迭代的工作项 0 递增,但不可以,您不能与同一迭代中的其他工作项共享该值(除非它们位于同一工作组中,在这种情况下,您需要使用屏障)。

规范中有关于 OpenCL 内存模型的更详细的描述,值得一读,以便很好地处理这些东西。

您需要使用 atomic_* 函数来确保全局内存符合您的预期。

请注意,尽管这些非常慢。

最新更新