コンテンツにスキップ

複数プロセスによるGPU共有とMPSについて

最終更新日:2025年6月4日


CUDAやOpenACCでは複数のプロセスで1つのGPUを共有利用することもできます。
複数のGPU(サブGPU)が利用可能なリソースグループを使う場合は、環境変数 CUDA_VISIBLE_DEVICES で利用するGPUを指定してください。
単一のGPU(サブGPU)のみ利用可能なリソースグループを使う場合は特に設定は必要ありません。

複数プロセスでGPUを共有利用する際は Multi-Process Service (MPS) を利用することで性能を向上させられる可能性があります。
詳細は NVIDIAのWebサイト を参照してください。

玄界では環境変数 CUDA_MPS_PIPE_DIRECTORYCUDA_MPS_LOG_DIRECTORY が自動的に設定されているため、他のジョブと干渉する心配はありません。

さらにジョブスクリプトのオプション設定によってGPUのCompute Modeの変更も可能です。(MIG利用時は変更できません。)
PJM -x PJM_GPU_COMPUTE_MODE=N により設定します。Nには 0, 2, 3 のいずれかを指定します。それぞれ以下を意味します:

  • 0 : DEFAULTモード。1つのGPUを複数のプロセスから同時に利用できます。
  • 2 : PROHIBITEDモード。GPUへのプロセス割り当てを禁止します。
  • 3 : EXCLUSIVE_PROCESSモード。1つのGPUを1プロセスのみが利用できます。1プロセス内の複数スレッドによるGPU利用は可能です。

以下はCompute ModeとMPSを設定して実行するジョブスクリプトの例です。

#!/bin/bash
#PJM -L rscgrp=b-batch
#PJM -L elapse=10:00
#PJM -L gpu=1
#PJM -x PJM_GPU_COMPUTE_MODE=0
#PJM -j
module load cuda
# MPSの起動
nvidia-cuda-mps-control -d
# GPUリソースの制限
export CUDA_MPS_ACTIVE_THREAD_PERCENTAGE=50
# プログラムの実行と終了待ち
./a1.out &
./a2.out &
wait
# MPSの終了
echo quit | nvidia-cuda-mps-control