3

私は、ブロックとグリッドが cuda でどのように機能するかをしっかりと把握していないという事実を強調する何かに取り組んでいます。トラバースして各要素に値を入力したい 1000x10 のマトリックスがあります。カーネルは次のようになります。

__global__ void myfun(float *vals,float *out, int M, int N)
  {  
      int row = blockIdx.y*blockDim.y + threadIdx.y;
      int col = blockIdx.x*blockDim.x + threadIdx.x;
      int index = row*N + col;

      if( (row < M ) && (col < N) ) {
          out[index] = index;
      }
}

ここで、M=1000 および N = 10 です。行列のすべての要素をカバーできるように、これを分割する方法がわかりません。1000*10 = 10,000 要素をカバーする必要があり、スレッド数に制限があるため、(10,1000,1) のブロック サイズは使用できません。pycuda を使用して、ブロック = (10,100,1)、グリッド = (1,10) などを試しましたが、行列要素を完全にカバーすることはできません。これを行う正しい方法は何ですか?

4

1 に答える 1

3

ブロック サイズを固定し、グリッド サイズを動的に保ちます。このようにして、M と N の値に関係なく、カーネルは行列の各要素をカバーします。

block = (8,8)
grid = ((N + 7) / 8, (M + 7) / 8)

このグリッドとブロックの構成でカーネルを起動します。デバイスの制限を守って、必要に応じてブロック サイズを変更できます。

于 2013-05-19T16:08:34.597 に答える