Мне нужно сделать расчет как: A [x] [y] = сумма {от z = 0 до z = n} {B [x] [y] [z] + C [x] [y] [z]}, где матрица A имеет размеры [высота] [ширина] и матрица B, C имеет размеры [высота] [ширина] [n].
Значения отображаются в памяти с помощью чего-то вроде:
index = 0;
for (z = 0; z<n; ++z)
for(y = 0; y<width; ++y)
for(x = 0; x<height; ++x) {
matrix[index] = value;
index++;
}
Я бы хотел, чтобы каждый блок вычислял одну сумму, поскольку каждый блок имеет собственную разделяемую память.Чтобы избежать скачек данных, я использую atomicAdd, что-то вроде этого:
Часть кода в глобальной памяти:
dim3 block (n, 1, 1);
dim grid (height, width, 1);
Ядро:
atomicAdd( &(A[blockIdx.x + blockIdx.y*gridDim.y]),
B[blockIdx.x + blockIdx.y*gridDim.y+threadIdx.x*blockDim.x*blockDim.y]
+ C[blockIdx.x + blockIdx.y*gridDim.y+threadIdx.x*blockDim.x*blockDim.y] );
Я хотел бы использоватьразделяемая память для расчета суммы, а затем скопировать этот результат в глобальную память.
Я не уверен, как сделать часть с общей памятью.В общей памяти каждого блока будет храниться только одно число (сумма результата).Как мне скопировать это число в нужное место в матрице А в глобальной памяти?