OpenMPを用いてマルチGPU†OpenMPを用いて、複数のGPUによりCUDAで計算します。 デバイスの数を取得†まず、GPUの数がわからない場合は、以下のようにして取得できます。 int GPU_N;
cudaGetDeviceCount(&GPU_N);
printf("GPU Device Count:%d\n",GPU_N);
OpenMPで計算†ここでは、GPUが二つの場合の例を示します。 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以外の場合はそちらも参考にしましょう。 |