1

CPUとメモリを使えば簡単です。

プロセスには大きな仮想アドレス空間があり、物理メモリに部分的にマップされています。現在のプロセスが物理メモリにないページにアクセスしようとすると、OS が介入し、スワップするページを選択し (たとえば、ラウンド ロビンを使用)、ディスクにスワップし、スワップから必要なページを読み取り、制御が行われます。プロセスに戻りました。そのページがないとプロセスを続行できないため、これは簡単です。

GPU カーネルは別の話です。

ユースケースを考えてみましょう:
優先度の高い [cpu] プロセス、つまりXがカーネルを呼び出します (これはブロッキング呼び出しです)。現時点では、OS がコンテキストを切り替えて、CPU を別のプロセス、つまりZに割り当てることは合理的です。例として、プロセスZも GPU で重い処理を行うとします。

では、GPU ドライバーは何をするのでしょうか。[優先度の高い] Xに属するカーネルを停止しますか? ZがXのカーネルをオフロードするのに十分なほど優先されていないことを OS に通知しますか? 一般に、2 つのプロセスが GPU リソースを必要としているが、利用可能な GPU メモリが一度に 1 つしか処理できない場合はどうなるでしょうか?

4

1 に答える 1

5

CUDA GPU は、粗い粒度 (「memcpy」または「カーネル起動」と考えてください) で協調的にコンテキストを切り替えます。両方のコンテキストに十分なメモリがある場合、ハードウェアは、わずかなパフォーマンス コストでそれらの間で協調的にコンテキストを切り替えることができます。(ただし、協調的であるため、実行時間の長いカーネルは他のカーネルの実行に干渉します。)

最新の GPU は仮想メモリ (つまり、アドレス変換によるメモリ保護) をサポートしていますが、デマンド ページングは​​サポートしていません。つまり、GPU にアクセス可能なすべてのメモリ (デバイス メモリとマップされた固定メモリ) が物理的に存在し、割り当て後にマップされる必要があります。

Windows Vista で導入された Windows Display Driver Model (WDDM) は、非常に粗い粒度でページングを行います。ドライバーは、特定のコマンド バッファーを実行するために必要な "メモリ オブジェクト" を追跡する必要があり、OS はそれらが存在することを確認します。OS は、不要なときにそれらを交換できます。CUDA の問題点は、ポインターを格納できるため、CUDA カーネルを実行するには、CUDA アドレス空間に関連付けられているすべてのメモリ オブジェクトが常駐している必要があることです。そのため、ページングは​​、WDDM が実行するように設計されたグラフィックス アプリケーションの場合と同様に、CUDA ではうまく機能しません。

于 2013-10-09T21:53:05.690 に答える