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

すぐに頭に浮かぶ2つの戦略があります。

  1. 最も外側のループの反復ごとに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. 最も外側のループの反復ごとに1 つのブロックを作成します。次に、内側のループには合計 20 * 20 = 400 回の反復があるため、最も内側のループの反復ごとに 1 つのスレッドを割り当てます。

    __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 に答える