*OpenMPを用いてマルチGPU [#h119404b]
OpenMPを用いて、複数のGPUによりCUDAで計算します。
*デバイスの数を取得 [#s4a96ce1]
まず、GPUの数がわからない場合は、以下のようにして取得できます。
#code(C){{
int GPU_N;
cudaGetDeviceCount(&GPU_N);
printf("GPU Device Count:%d\n",GPU_N);
}}
*OpenMPで計算 [#kdf42578]
ここでは、GPUが二つの場合の例を示します。
#code(C){{
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のみで使いましょう。
*他の方法 [#lc1f4fdc]
NVIDIA SDKにSimple multi-GPUというサンプルがあるのでOpenMP以外の場合はそちらも参考にしましょう。