我一直在考虑如何使用归约在 CUDA 上执行此操作,但我对如何完成它有点茫然。C代码如下。要记住的重要部分——变量precalculatedValue取决于两个循环迭代器。此外,变量ngo对m的每个值都不是唯一的……例如m = 0,1,2 可能有ngo = 1,而m = 4,5,6,7,8 可能有ngo = 2,等等。我已经包含了循环迭代器的大小,以防它有助于提供更好的实现建议。
// macro that translates 2D [i][j] array indices to 1D flattened array indices
#define idx(i,j,lda) ( (j) + ((i)*(lda)) )
int Nobs = 60480;
int NgS = 1859;
int NgO = 900;
// ngo goes from [1,900]
// rInd is an initialized (and filled earlier) as:
// rInd = new long int [Nobs];
for (m=0; m<Nobs; m++) {
ngo=rInd[m]-1;
for (n=0; n<NgS; n++) {
Aggregation[idx(n,ngo,NgO)] += precalculatedValue;
}
}
在之前的案例中,当precalculatedValue只是内部循环变量的函数时,我将值保存在唯一的数组索引中,并在事后通过并行归约(推力)添加它们。但是,这种情况让我很困惑:m的值并没有唯一地映射到ngo的值。因此,我看不出有一种方法可以使此代码高效(甚至可行)以使用减少。任何想法都是最受欢迎的。