Я делаю следующее в ядре 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
может быть в постоянной памяти, а не в глобальной, но кажется, что объем постоянной памяти на моем графическом процессоре невероятно ограничен)
Будет ли это работать? Является ли "+=" реализованным атомарным способом или есть вероятность того, что параллельные операции перезапишут друг друга?