削減を使用して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が内部ループ変数の関数のみであった場合、値を一意の配列インデックスに保存し、事後に並列削減(Thrust)を追加しました。しかし、この場合は困惑しました。mの値はngoの値に一意にマップされていません。したがって、このコードを効率的に(または実行可能に)して、削減を使用する方法がわかりません。どんなアイデアでも大歓迎です。