Форум Академгородка, Новосибирск > многопоточное программирование
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: многопоточное программирование
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование
Vitae ontologica
Добрый день! Помогите советом!
Столкнулся с такой проблемой: Есть два одномерных массива данных (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]
}

i<=N,l<=N, lи l1, k и k1 отличаются друг от друга на +-1.
(в общем - для каждой точки по координатам определяем 4 ближайших узла сетки, и этим узлам приписываем значения, потом смещаем точку, и повторяем то же.)

Если всё это реализовывать на CUDA, то логично разделить между нитями массивы х и у. Однако как только мы начнём писать в array, как получится, что множеству нитей необходимо изменить одинаковые ячейки памяти. В этом случае нельзя использовать shared-память, т.к. массив просто туда не поместится. А при работе с глобальной памятью во-первых для даблов нет атомарных операций, а во-вторых, они бы очень затормозили процесс.
Что тут можно придумать?
Dassie
А можно сначала просчитать все изменения array, отсортировать, просуммировать для каждого узла, и только потом применить?
Vitae ontologica
Цитата(Dassie @ 09.03.2012, 22:34) *
А можно сначала просчитать все изменения array, отсортировать, просуммировать для каждого узла, и только потом применить?

А где считать, сортировать, суммировать? только в той же глобальной памяти.
Есть такая идея - изменить нумерацию x[i] - x[i,l,k] - номер частицы в квадратике и номер квадратика. Вести группу локальных переменных для узлов квадратиков (потому что точка может переместиться в соседние квадратики, приходится рассматривать группу таких квадратиков). И только потом просуммировать локальные переменные (кстати, как?) и одной нити записать в глобальную память. опять же разделяемую память использовать нельзя - не влезет - 100 блоков по 16 значений узлов в даблах - это больше 16К.
Dassie
Дык если в шареную память ничего не лезет, без глобальной по-любому не обойтись. Если её читать/писать параллельно, как положено (как по русски сказать coalescing?), выходит довольно-таки быстро.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.