新しく作成されたプロセスでCUDAを初期化するには、今日の多くのサーバグレードマシンではかなり時間がかかります。as long as a half-second以上。 @RobertCrovella explainsのように、CUDAの初期化には通常、デバイスとホストのメモリマップの調和を含む統一メモリモデルの確立が含まれます。これは、大量のメモリを持つマシンではかなり長い時間がかかります。この長い遅延に寄与する他の要因が存在する可能性があります。CUDAの非常に長い初期化遅延を緩和するにはどうすればよいですか?
複雑な仮想メモリマッピングを使用しない一連のCUDA利用プロセスを実行する場合、この効果は非常に厄介なものになります。それらは長い待ち時間を待つ必要があります。 CUDAの初期化(おそらくちょっとしたクリーンアップコード)があったとしても、ちょうど再利用できます。
明らかに、これらのすべてのプロセスが1つのプロセス内で実行されるようにコードを書き直すと、初期化コストがかかりません。しかし、より簡単なアプローチはありませんか?何について:
- プロセス間で同じ状態情報/ CUDAコンテキストを渡すか?
- ほとんどのホストメモリを完全に無視するようにCUDAに指示しますか?
- Unified Memoryのハーモナイゼーションを今よりも怠惰なものにして、実際に必要な程度にしか起こらないようにします。
- ユニファイドメモリでCUDAを起動できませんか?
- いくつかのデーモンプロセスを側面に保持し、それをラッチすると既に初期化されたCUDA状態になっていますか?
うーん、重いとオーバーヘッドを積んだの種類が鳴ります。私はいつもIPCをしたくありません...しかし、そのFOSSですか?たぶん、その下位のレイヤーしか取ることができず、簡単な代替方法を一緒にハックすることもできます。 – einpoklum
これはNVIDIA提供のコードベースです。私はそれがクローズドソースだと思うだろう。 – talonmies
MPSはクローズドソースです。複数のGPUを持つマシンでいくつかのシナリオでいくつかの緩和策を提供する別の方法は、CUDAランタイムが 'CUDA_VISIBLE_DEVICES' [環境変数](http://docs.nvidia.com/cuda)を介して必要なGPUのみを使用するように制限することです/cuda-c-programming-guide/index.html#env-vars)。これは、プロセスごとに指定できます。この方法論は、特定のパススルー以前のUMシナリオでいくつかの利点をもたらすかもしれません。 –