0

如何在 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
         }         
     }
}
4

1 回答 1

3

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

  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);
    
于 2013-03-12T19:17:59.440 回答