並列計算の仕組み事始め

  • CUDAのHost codeに以下のような記述がある。
    dim3 grid(size_x / BLOCK_DIM, size_y / BLOCK_DIM, 1);
    dim3 threads(BLOCK_DIM, BLOCK_DIM, 1);
    transpose<<< grid, threads >>>(d_odata, d_idata, size_x, size_y);
  • grid, threads,BLOCKについて
    • GPUとGrid
      • GPUは並列計算用に演算ユニットを多数持っている部品である
      • GPUとそのドライバ?によって、GPUはある命令を受けると、その多数の演算ユニットを使って並列計算をするように仕組まれている
      • GPUが並列計算をするときには、次のような仕組みで並列計算をすることにしている(それがCUDAな仕組み)
      • GPUにグリッドと呼ばれる構造を決めて、それをGPU上の並列計算の塊とする
      • グリッドは、並列演算の命令を受け取る単位である
      • グリッドは、その名の通り、格子上の構造で、CUDAでは3次元格子とする(ようだ)。従来型の並列計算機もGridだったりする。それは、並列計算をする仕組みとして適当であるからで、それをGPU/CUDAも踏襲しているということ(だと思う)
      • 上記の例では、gridなる関数に、3次元のそれぞれの長さが与えられている
      • 上記の例では、transposeというカーネルがグリッドに与えられている
      • グリッドは、ブロックの格子
    • ブロック
      • ブロックも格子上の構造を持つ。CUDAでは3次元格子(のようだ)
      • ブロックはスレッドの格子
      • 上記の例では、threadsなる関数に3次元のそれぞれの長さが与えられている
      • 同一ブロック内のスレッドは、(密接に)情報を共有できる
      • 異なるブロック内のスレッドは、情報を共有しないことを原則とする(共有するとしたら、それは、固定した情報(読み取り専用の情報)とすることで、並列計算は効率化されている
    • GPUカーネルを渡す
      • カーネルと2種類の情報、grid,threadsに関する情報と処理の引数、を与えて、GPUに処理させる
      • 引数には、入力値の塊が与えられ、それは、grid,threads情報に従って、入力値の位置で判断されて異なる演算ユニットに渡されて処理される
  • 参考記事(少し古いけれども)