GTC 2015 - MPIを使ったマルチGPUのプログラミング「高性能化編」
しかし、NVIDIAはMPS(Multi Processing Service)という機能を提供している。各プロセスからのGPUへの処理依頼はいったんMPSプロセスが受信し、プロセスAのメモリコピーのストリームとプロセスBの計算処理のように、依存関係がないものは並列に実行するようにスケジューリングを行う。このため、次の図のように、隙間がなくなり実行効率を高めることができる。
ただし、MPSプロセスが間に入るため、多少のオーバヘッドがあるので、まったく並列化ができない場合は性能が低下するので使用すべきでないという。
また、NVIDIAはKepler GPUからHyper-Qという機能をサポートした。CUDAにはストリームというメモリ転送やカーネル実行を行うコマンド列を実行する機能があるが、Hyper-Qは複数のストリームから実行できるコマンドを探して実行する機能で、GPUの空き時間を減らすことができる。
次の図はHyper-QとMPSを使って、処理のオーバラップを引き上げたときの実行状況を示す。
次の図はCPUの1コアだけを使い、1ランク/GPUの場合と複数ランク/GPUの場合の性能を5種のアプリケーションで比較したもので、棒グラフの下側の緑の部分は、複数ランクでGPUを共有したことによる性能向上、上の部分はMPSを使った場合の性能の上積み分である。