如何将这种嵌套的for循环转换为CUDA C ++进行并行编程?

时间:2019-06-24 00:44:13

标签: c++ cuda

这就是我尝试过的。很难找到更好的索引...这种嵌套的for循环有些难以解决。

    int k=0;
    for (int m=0; m<7; i++) // outer loop
    {   
      for(int j=0; j<100; j++) // inner loop 1
      {a[k] = b[m] + c[j];
      k++;
      }

      for(int j=0; j<100; j++) // inner loop 2
      {a[k] = b[m] - c[j];
      k++;
      }

    }

1 个答案:

答案 0 :(得分:3)

对于您的示例代码,循环迭代似乎是独立的,这使事情变得更容易。

我们可以从计算迭代总数开始:8 *(100 + 100)= 1600。

因此,如果我们要完全分配工作,我们将希望启动至少1600个线程的网格。

您的m变量似乎与循环无关,因此b[m]实际上是您显示的代码的常数。

另一个计划是根据j确定k的索引,但这也很容易,它只是k%100

最终的计划项目是考虑循环迭代中c上符号的变化。我们可以使用k/100帮助我们确定这一点。

因此,我们将创建一个全局唯一的线程索引变量,并将其用作我们的k变量:

__global__ void my_kernel(T1 *a, T2 *b, T3 *c, int N){

  int k = threadIdx.x+blockDim.x*blockIdx.x;
  int m = <some value>;
  int j = k%100;
  if (k < N)
      a[k] = b[m] + ((k/100)&1)?(-c[j]):c[j];
}

确保使用至少1600个线程(在一维网格中)启动它,并为N传递1600个线程。 对于与T1T2T3对应的任何类型,abc可以是typedef。

请注意,在您的代码中您有以下内容:

for(int j=0; j<100; j+=)
                      ^
                     This doesn't make sense to me.

所以我只是假装是这样的:

for(int j=0; j<100; j++)

具有这样的修改(与在问题中进行的修改不同):

for (int m=0; m<7; m++) // outer loop
                   ^

唯一的变化是m变量的计算:

__global__ void my_kernel(T1 *a, T2 *b, T3 *c, int N){

  int k = threadIdx.x+blockDim.x*blockIdx.x;
  int m = k/200;  // change this line
  int j = k%100;
  if (k < N)
      a[k] = b[m] + ((k/100)&1)?(-c[j]):c[j];
}