OpenMPを用いてマルチGPU

OpenMPを用いて、複数のGPUによりCUDAで計算します。

デバイスの数を取得

まず、GPUの数がわからない場合は、以下のようにして取得できます。

  1
  2
  3
int GPU_N;
cudaGetDeviceCount(&GPU_N);
printf("GPU Device Count:%d\n",GPU_N);

OpenMPで計算

ここでは、GPUが二つの場合の例を示します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
float *d_f0,*d_f1;
 
//スレッド数指定 
#pragma omp parallel num_threads(2)
#pragma omp sections
{
    #pragma omp section //GPU0
    {
      cudaSetDevice(0);
      cudaMalloc( (void**)&d_f0, sizeof(float)*512);
      //処理1(GPU0)
      #pragma omp barrier
      //処理2(GPU0)
      #pragma omp barrier
      //処理3(GPU0)
    }
    #pragma omp section //GPU1
    {
      cudaSetDevice(1);
      cudaMalloc( (void**)&d_f1, sizeof(float)*512);
      //処理1(GPU1)
      #pragma omp barrier
      //処理2(GPU1)
      #pragma omp barrier
      //処理3(GPU1)
    }
}

ただし、確保したメモリへのポインタは確保したGPUのみで使いましょう。

他の方法

NVIDIA SDKにSimple multi-GPUというサンプルがあるのでOpenMP以外の場合はそちらも参考にしましょう。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-10-27 (木) 15:09:15