根据我对这个问题的理解,我说你不需要 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个不同信号的所有meanValues进行全局归约,那么你需要使用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;
}
我希望这可以帮助你。有任何疑问,请告诉我。