Исходя из моего понимания вопроса, я говорю, что вам не нужны N регистров для хранения среднего значения N различных сигналов.
Если у вас уже есть N потоков [Учитывая, что каждый поток выполняет сокращение только для одного сигнала], то вам не нужны N регистров для хранения сокращения одного сигнала. Все, что вам нужно, это один регистр для хранения среднего значения.
dim3 threads (N,1);
reduction<<<threads,1>>>(signals); // signals is the [N*M] array
__global__ reduction (int *signals)
{
int id = threadIdx.x;
float meanValue = 0.0;
for(int i = 0; i < M; i++)
meanValue = signals[id*M +i];
meanValue = meanValue/M;
// Then do the subtraction
for(int i = 0; i < M; i++)
signals[id*M +i] -= meanValue;
}
Если вам нужно выполнить глобальное уменьшение всех средних значений N различных сигналов, то вам нужно использовать 2 регистра [один для хранения локального среднего и другой для хранения глобального среднего] и разделяемой памяти
dim3 threads (N,1);
reduction<<<threads,1>>>(signals); // signals is the [N*M] array
__global__ reduction (int *signals)
{
__shared__ float means[N]; // shared value
int id = threadIdx.x;
float meanValue = 0.0;
float globalMean = 0.0;
for(int i = 0; i < M; i++)
meanValue += signals[id*M +i];
means[id] = meanValue/M;
__syncthreads();
// do the global reduction
for(int i = 0; i < N; i++)
globalMean += means[i];
globalMean = globalMean/N;
// Then do the subtraction
for(int i = 0; i < M; i++)
signals[id*M +i] -= globalMean;
}
Надеюсь, это поможет вам. Любые сомнения, дайте мне знать.