CUDA中的三重循环

时间:2013-03-12 18:59:55

标签: c++ cuda parallel-for

如何在CUDA中编写C ++表达式?第一次循环很容易但之后? (我把我的启动内核)

启动内核

dim3 dimBlock( 16 );
dim3 dimGrid( ( c + ( dimBlock.x - 1 ) ) / dimBlock.x );

C ++ 3循环表达式

for ( int i = 0; i < c; i++ ) {

     int val1 = A[ i ];

     int val2 = B[ i ];

     for ( int j = val1 - 10; j < val1 + 10; j++ ) { 

         for ( int k = val2 -10; k < val2 + 10; k++ ) {

             //calculations
         }         
     }
}

1 个答案:

答案 0 :(得分:2)

有两种策略可以立即浮现在脑海中。

  1. 为最外层循环的每次迭代创建一个线程。然后每个线程将在其线程代码中保留内部2个嵌套循环。

    __global__ void mykernel(int *A, int *B, int size_c, ...){
      int i = threadIdx.x + blockDim.x*blockIdx.x;
      if (i < size_c){
        int val1 = A[ i ];
        int val2 = B[ i ];
        for ( int j = val1 - 10; j < val1 + 10; j++ ) { 
          for ( int k = val2 -10; k < val2 + 10; k++ ) {
             //calculations
          }         
        }    
      }
    }
    
    %define nTPB 512
    dimBlock(nTPB);
    dimGrid((c+nTPB-1)/nTPB);
    
  2. 为最外层循环的每次迭代创建一个。然后,因为内部循环具有20 * 20 = 400次迭代的迭代,所以为每个最内部循环迭代分配一个线程。

    __global__ void mykernel(int *A, int *B, ...){
      int i = blockIdx.x;
      int idx = threadIdx.x;
      int idy = threadIdx.y
      int val1 = A[ i ];
      int val2 = B[ i ];
      if (idx < 20) && (idy < 20) {
        int j = val1 - 10 + idy; 
        int k = val2 - 10 + idx;
           //calculations
      }            
    }
    
    dimBlock(20, 20);
    dimGrid(c);