OpenCL:内核之间的同步

时间:2013-12-24 12:35:44

标签: c opencl sync 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增加。我对此是对的吗?

2 个答案:

答案 0 :(得分:1)

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

所以,是的,*i值将通过下一个迭代的工作项0递增,但不是,您不能与同一迭代中的其他工作项共享该值(除非它们在同一个迭代中)工作组,在这种情况下你需要使用障碍物。)

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

答案 1 :(得分:0)

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

请注意,虽然这些非常慢。