我在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;以原子方式实现,还是有可能并发操作相互覆盖?
答案 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);
}
}