Parallel processing CUDA中线程和块的并行化

Parallel processing CUDA中线程和块的并行化,parallel-processing,cuda,Parallel Processing,Cuda,我有以下简单的嵌套for循环 float a[1024][1024], b[1024] for(i=1; i < 1024; i++){ for(j = 1; j < 1024 - i; j++){ b[i + j] += a[i][j]; } } float a[1024][1024],b[1024] 对于(i=1;i

我有以下简单的嵌套for循环

float a[1024][1024], b[1024]

for(i=1; i < 1024; i++){
    for(j = 1; j < 1024 - i; j++){
        b[i + j] += a[i][j];    
    }
}
float a[1024][1024],b[1024]
对于(i=1;i<1024;i++){
对于(j=1;j<1024-i;j++){
b[i+j]+=a[i][j];
}
}
我试图理解如何使用CUDA线程和线程块来与GPU并行来划分这个问题。到目前为止,我相信我总共进行了N=522753次计算。我不完全确定如何从这里开始:我知道每个块中的线程数应该是32的倍数。例如,如果每个块的线程数是1024,那么我需要至少511个块,其中每个线程从1->N进行计算。有人能解释一下如何选择每个块的最佳线程数,以及如何实际并行实现这一点吗

长篇大论:

编辑:c矩阵应该是列主键而不是行主键,排序应该是列而不是行,但为了可读性,我在这里将其保留为行主键

您可以(仅此一次)为每个工作项准备计数和引用矩阵,以便第一列为计数,其余为引用,最后一列为写入地址

c[0] = {1, &a[1][1],                   &b[2]}; // b[2]
c[1] = {2, &a[1][2],&a[2][1],          &b[3]}; // b[3]
c[2] = {3, &a[1][3],&a[2][2],&a[3][1], &b[4]}; // b[4]
..
然后根据索引数/子数组大小对它们进行排序(一次),使它们成为

   c[0]    = {1, &a[1][1],         &b[2]}    //  b[2]
   c[1]    = {1, &a[1022][1],      &b[1023]} // b[1023]
   ..
   c[k]    = {5, x1,y1,z1,t1,w1,   &b[m]} // b[m]
   c[k+1]  = {5, x2,y2,z2,t2,w2,   &b[n]} // b[n]
在扭曲/块的cuda线程之间平衡的工作量

然后访问c矩阵(每行1个cuda线程),了解在每个工作项的普通for循环中要添加哪些元素

   const int length = (int)c[workitemId][0];
   for(int i=1;i<length+1;i++)
      resultOfWorkitem += *(c[workitemId][i]);
   *(c[workitemId][length+1])=resultOfWorkitem;

保留连续的地址访问和每个工作项的平衡工作可能是不可能的。

@Talonmes这是提供给我的一个示例,并不打算实际执行。伪代码比任何东西都多,但我仍然不明白如何划分块和每个块的线程来并行化概念。本例中的问题是不同的(I,j)-对希望写入同一位置。说(3,0)和(0,3)。您可以使用原子添加,但最好是以某种方式进行分区,即使用更少的原子添加,并且每个线程有更多的工作。
 c[0] = {1, &a[1][1] // address x    \
 c[1] = {2, &a[1][2] // address x+1   > less than L1 cache line size 128byte?
 c[2] = {3, &a[1][3] // address x+2  /