2011-07-25 13 views
5

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

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

単純にストリームをホストスレッドで作成し、ストリーム参照をワーカースレッドに渡すと、そのストリーム番号を自分のCUDAライブラリに渡すことができ、すべて同じコンテキストから作業できますか?

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

おかげ

答えて

6

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

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

コンテキストpush/popは軽量操作で、CUDA 3.2以降はCUDAランタイムアプリケーションで実行できます。だから私の提案は、CUDAコンテキストを初期化し、cuCtxPopCurrent()を呼び出して、コンテキストを「浮動」にすることです。スレッドがコンテキストを操作したいときはいつでも、cuCtxPushCurrent()/ cuCtxPopCurrent()を使ってその使用法を括弧で囲む必要があるたびに、 "浮動"状態を自然な状態と見なしてください。

+0

PopCurrent()は実際にコンテキストを保持する「キュー」からそれを削除します。そのため、他のスレッドからアクセスできないのですか?ホストスレッドから現在のコンテキストをポップし、そのコンテキストをワーカースレッドに渡してコンテキストスタックに「プッシュ」することはできますか?文脈のような音は "並行待ち行列"にあり、ミューテックスを持っていなければならないでしょうか? – Derek

+0

コンテキストが作成されると、コンテキストは現在のコンテキストスタックにプッシュされます。コンテキストをポップすると、cuCtxPushCurrent()を使って別のカレントコンテキストスタックにプッシュされるまで、コンテキストをポップするとすべてのCPUスレッドで使用できなくなります。したがって、あなたが記述するワークフローは、APIが実現できるように設計されたものです。 コンテキストはスレッドセーフなので、実装する必要がある追加のスレッド同期は、アプリケーションで必要に応じて順序付けやその他のセマンティクスを適用することだけです。 – ArchaeaSoftware

+0

私は 'cuCtxSetCurrent(CUcontext ctx)'を各スレッドに使用しています。プッシュ後のポップと同様に、スレッドにもうコンテキストが必要ないときに、これには何かが必要ですか? –

関連する問題