在OpenCL中并发更新(x + = a)到全局内存

时间:2015-03-04 10:47:23

标签: opencl concurrentmodification

我在OpenCL内核中执行了以下操作(简化示例):

__kernel void step(const uint count, __global int *map, __global float *sum)
{
    const uint i = get_global_id(0);
    if(i < count) {
        sum[map[i]] += 12.34;
    }
}

这里,sum是我想要计算的数量(之前在另一个内核中设置为零),而map是从整数i到整数j的映射,这样多个i可以映射到相同的j

map可能在常量内存而不是全局,但似乎GPU上的常量内存量非常有限。

这会有用吗?是&#34; + =&#34;以原子方式实现,还是有可能并发操作相互覆盖?

1 个答案:

答案 0 :(得分:3)

  

这会有用吗?是以原子方式实现的“+ =”,还是有可能并发操作会相互覆盖?

它无效。当线程访问由其他线程写入的内存时,您需要显式地采用原子操作。在这种情况下,atomic_add

类似的东西:

__kernel void step(const uint count, __global int *map, __global double *sum)
{
    const uint i = get_global_id(0);
    if(i < count) {
        atomic_add(&sum[map[i]], 1234);
    }
}