c - OpenCL:内核之间的同步

标签 c opencl synchronization gpgpu

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

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

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/

相关文章:

java - 多线程中的死锁示例

java - 多次调用 CountDownLatch.await(int) 超时

c - 警告 : function returns address of local variable [enabled by default]

c - 在C中使用malloc不起作用

c - 预处理的 printf 函数

synchronization - 同步数据的最佳实践

c - 如何不使用 waitpid 阻止父级

c - 如何将多个小C程序组合在一起?

c++ - OpenCl 内核代码

android - GPU 与 CPU 编程 : inconsistencies in processing times