所以我正在尝试做这样的事情:
在我的主机代码中,我有一个循环
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 内存模型有更详细的描述,值得一读,以便更好地掌握这些内容。
关于c - OpenCL:内核之间的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20761065/