2 つの別々の OpenCL 対応プログラム間、またはより具体的にはOpenCL カーネルを実行するために GPU を同時に必要とする 2 つの別々のプロセス間で GPU を共有する方法はありますか? もしそうなら、これはどのように行われますか?
2 に答える
何を共有と呼ぶかによります。
一般に、同じ GPU で OpenCL デバイスを作成する 2 つのプロセスを作成できます。その場合、物事がうまく機能することを確認するのは、ドライバー/OS/GPU の責任です。
とはいえ、ほとんどの実装では、GPU の実行をタイムスライスしてそれを実現します (グラフィックスの場合と同様)。
しかし、これはあなたが求めているものではないと思います。ユースケースで質問を拡張できますか?
現在の GPU (NVidia の Fermi を除く) は、複数のカーネルの同時実行をサポートしていません。さらに、今日まで GPU はプリエンプティブ マルチタスクをサポートしていません。それは完全に協力的です!カーネルの実行を一時停止して、後で続行することはできません。したがって、時間ベースの GPU 共有の粒度は、カーネルの実行時間に依存します。
したがって、GPU アクセスを必要とする複数のプログラムを実行している場合は、GPU サイクルを必要とするカーネル間で GPU 時間をタイムスライスできるように、カーネルの実行時間が短いことを確認する必要があります (経験則では 100 ミリ秒未満)。これを行うことも重要です。そうしないと、ホスト システムのグラフィックスも GPU アクセスを必要とするため、非常に応答しなくなるからです。これは、無限ループまたは長いループ内のカーネルが明らかにシステムをクラッシュさせる可能性があります。