web-dev-qa-db-ja.com

1つのGPUで複数のCUDAアプリケーションを実行する

CUDAドキュメントは、1つのGPUを共有できるCUDAプロセスの数を特定していません。たとえば、システムにGPUカードが1枚だけ取り付けられている同じユーザーが複数のCUDAプログラムを起動した場合、どのような影響がありますか?実行の正確さを保証しますか?この場合、GPUはどのようにタスクをスケジュールしますか?

27
cache

独立したホストプロセスからのCUDAアクティビティは通常、プロセスごとに1つ、独立したCUDA contexts を作成します。したがって、別々のホストプロセスから起動されたCUDAアクティビティは、同じデバイス上の別々のCUDAコンテキストで実行されます。

個別のコンテキストでのCUDAアクティビティはシリアル化されます。 GPUは1つのプロセスからアクティビティを実行し、そのアクティビティがアイドル状態の場合、別のコンテキストにコンテキスト切り替えして、他のプロセスから起動されたCUDAアクティビティを完了することができます。詳細なコンテキスト間スケジューリング動作は指定されていません。 (単一のGPUで複数のコンテキストを実行しても、通常、デバイス割り当てのメモリ可用性などの基本的なGPU制限に違反することはできません。)

この場合の「例外」(独立したホストプロセスからのGPUアクティビティのシリアル化)は、CUDAマルチプロセスサーバーです。簡単に言えば、 [〜#〜] mps [〜#〜] は、複数のホストプロセスから発せられるCUDAアクティビティを収集し、単一のアクティビティから発せられたようにそのアクティビティを実行する「ファネル」として機能しますホストプロセス。主な利点は、 他の方法では同時に実行できる可能性があるカーネルのシリアル化 を回避することです。正規のユースケースは、すべてが単一のGPUリソ​​ースを使用することを意図する複数のMPI=ランクを起動するためのものです。

上記の説明は、「デフォルト」のGPUに適用されることに注意してください 計算モード 。 「Exclusive Process」または「Exclusive Thread」コンピューティングモードのGPUは、単一のデバイスで複数のプロセス/コンテキストを作成しようとする試みを拒否します。これらのモードの1つで、他のプロセスが既に使用中のデバイスを使用しようとすると、CUDA APIが失敗を報告します。計算モードは nvidia-smiユーティリティ を使用して変更できる場合があります。

32
Robert Crovella