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

Concurrent updates (x += a) to global memory in OpenCL

我在 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 到整数 [=14= 的映射], 这样多个 i 可以映射到同一个 j.

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

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

Will this work? Is a "+=" implemented in an atomic way, or is there a chance of concurrent operations overwriting each other?

不行。当线程访问其他线程写入的内存时,您需要显式地求助于原子操作。在这种情况下,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);
    }
}