并发更新 (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);
}
}
我在 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);
}
}