嵌套循环中数组的二维累积和——CUDA实现?

嵌套循环中数组的二维累积和——CUDA实现?,cuda,nested-loops,reduction,accumulator,Cuda,Nested Loops,Reduction,Accumulator,我一直在考虑如何使用reduces在CUDA上执行此操作,但对于如何完成此操作,我有点不知所措。下面是C代码。需要记住的重要部分是:变量precalculatedValue取决于两个循环迭代器。此外,变量ngo并非对m的每个值都是唯一的。。。e、 g.m=0,1,2可能有ngo=1,而m=4,5,6,7,8可能有ngo=2,等等。我已经包括了循环迭代器的大小,以防它有助于提供更好的实现建议 // macro that translates 2D [i][j] array indices to 1

我一直在考虑如何使用reduces在CUDA上执行此操作,但对于如何完成此操作,我有点不知所措。下面是C代码。需要记住的重要部分是:变量precalculatedValue取决于两个循环迭代器。此外,变量ngo并非对m的每个值都是唯一的。。。e、 g.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;
    }
}
//将二维[i][j]数组索引转换为一维平坦数组索引的宏
#定义idx(i,j,lda)((j)+(i)*(lda)))
int Nobs=60480;
int=1859;
int=900;
//非政府组织起源于[1900]
//rInd是一个初始化(并在前面填充)的文件,如下所示:
//外皮=新长整型[Nobs];
对于(m=0;m只是一个尝试

我怀疑转换循环可能会有所帮助

for (n=0; n<NgS; n++) {
    for (m=0; m<Nobs; m++) {            
        ngo=rInd[m]-1;
        Aggregation[idx(n,ngo,NgO)] += precalculatedValue(m,n);
    }
}

for(n=0;n+1):“从简单开始,衡量性能,然后决定如何优化。”--一般来说,这是一个很好的建议,特别是对于GPU之类的东西。谢谢你提供了详细的答案!作为第一步,我确定原始C算法输出与转置的循环相同。有各种计算依赖于两个迭代器,我没有意识到我可以在不影响更正的情况下进行这种简单的更改输出的ss。我将从这里开始,如果atomicAdd给了我一个合适的性能。但是,我确实忘记了一个问题。precalculatedValue(a,b)类型是double。(实际上,它是一个具有两个双值的结构,因此操作重复两次)我认为这会造成性能瓶颈。