5

私は現在、一連の pthreads (linux) を生成するアプリケーションを使用しており、それらのそれぞれが独自の CUDA コンテキストを作成します。(現在cuda 3.2を使用しています)。

私が抱えている問題は、独自のコンテキストを持つ各スレッドが GPU で大量のメモリを消費するように見えることです。スレッドあたり 200MB のようなものなので、これは本当に私を制限しています。

ホストスレッドでストリームを作成し、ストリーム参照をワーカースレッドに渡すだけで、CUDA ライブラリにストリーム番号を渡すことができ、すべてが同じコンテキストで機能しますか?

ワーカー スレッドは、親スレッドと同じ CUDA コンテキストを自動的に認識しますか?

ありがとう

4

1 に答える 1

11

各 CUDA コンテキストはかなりのデバイス メモリを消費し、それらのリソースは互いに厳密に分割されています。たとえば、コンテキスト A で割り当てられたデバイス メモリは、コンテキスト B からアクセスできません。ストリームも、作成されたコンテキストでのみ有効です。

ベスト プラクティスは、デバイスごとに 1 つの CUDA コンテキストを作成することです。デフォルトでは、その CUDA コンテキストには、それを作成した CPU スレッドからのみアクセスできます。他のスレッドから CUDA コンテキストにアクセスする場合は、cuCtxPopCurrent() を呼び出して、それを作成したスレッドからポップします。その後、コンテキストを他の CPU スレッドの現在のコンテキスト スタックにプッシュすることができ、後続の CUDA 呼び出しはそのコンテキストを参照します。

コンテキストのプッシュ/ポップは軽量の操作であり、CUDA 3.2 以降では、CUDA ランタイム アプリで実行できます。したがって、私の提案は、CUDA コンテキストを初期化してから、cuCtxPopCurrent() を呼び出して、一部のスレッドがそれを操作したい場合を除き、コンテキストを「フローティング」にすることです。「フローティング」状態が自然な状態であると考えてください。スレッドがコンテキストを操作したいときはいつでも、その使用法を cuCtxPushCurrent()/cuCtxPopCurrent() で囲みます。

于 2011-07-26T13:11:44.433 に答える