Столкнулся с такой проблемой: Есть два одномерных массива данных (doubl'ов) размером 1000*N*N, N~100-1000. В них хранятся координаты (в одном х, в другом у).
Что происходит сейчас (func - некая функция, move -некие числа, разные для каждого i, но это тут неважно)
Код
for(i=0;i<1000*N*N;i++){
l=(int)func(x[i]);
k=(int)func(y[i]);
x[i]=x[i]+move1;
y[i]=y[i]+move2;
l1=(int)func(x[i]);
k1=(int)func(y[i]);
array[l,k]+=move3;
array[l+1,k]+=move4;
array[l,k+1]+=move5;
array[l+1,k+1]+=move6;
//потом то же для array[l1,k1]
}
l=(int)func(x[i]);
k=(int)func(y[i]);
x[i]=x[i]+move1;
y[i]=y[i]+move2;
l1=(int)func(x[i]);
k1=(int)func(y[i]);
array[l,k]+=move3;
array[l+1,k]+=move4;
array[l,k+1]+=move5;
array[l+1,k+1]+=move6;
//потом то же для array[l1,k1]
}
i<=N,l<=N, lи l1, k и k1 отличаются друг от друга на +-1.
(в общем - для каждой точки по координатам определяем 4 ближайших узла сетки, и этим узлам приписываем значения, потом смещаем точку, и повторяем то же.)
Если всё это реализовывать на CUDA, то логично разделить между нитями массивы х и у. Однако как только мы начнём писать в array, как получится, что множеству нитей необходимо изменить одинаковые ячейки памяти. В этом случае нельзя использовать shared-память, т.к. массив просто туда не поместится. А при работе с глобальной памятью во-первых для даблов нет атомарных операций, а во-вторых, они бы очень затормозили процесс.
Что тут можно придумать?