2013-02-15 20 views
10

計算能力2.x以上のNVIDIA gpusは、同時に16個のカーネルを実行できます。 しかし、私のアプリケーションは7つの "プロセス"を生み出し、これらの7つのプロセスはそれぞれCUDAカーネルを起動します。並列にCUDAカーネルを起動する複数のプロセス

私の最初の質問は、これらのカーネルの期待される動作が何であるかということです。それらは同時に実行されるか、または異なるプロセスによって起動されるため、順次実行されます。

CUDA Cプログラミングガイドが言うので、私は混乱しています:

「1つのCUDAコンテキストからカーネルは別のCUDAコンテキストからカーネルを同時に実行することはできません。」 これはCUDAの「コンテキスト」とは何ですか?

ありがとうございます!

答えて

14

CUDAコンテキストは、ホストスレッドまたはプロセスが所有するコードとデータを保持する仮想実行スペースです。現在のすべてのハードウェアを搭載したGPUでアクティブにできるコンテキストは1つだけです。

最初の質問に答えるには、コンテキストを確立して同じGPUで同時に実行しようとする7つのスレッドまたはプロセスがある場合、それらはシリアル化され、GPUへのアクセスを待っているプロセスはブロックされます。実行中のコンテキストの所有者が生成します。私の知る限りでは、タイムスライシングやスケジューリングヒューリスティックは文書化されておらず、オペレーティングシステムからオペレーティングシステムまで統一されていない(私は疑うだろう)。

GPUコンテキストを保持する単一のワーカースレッドを起動し、他のスレッドからのメッセージを使用してGPUに作業をプッシュする方がよいでしょう。あるいは、CUDAドライバAPIで利用可能なコンテキスト移行機能がありますが、これは同じプロセスのスレッドでのみ機能し、移行メカニズムにはレイテンシとホストCPUオーバーヘッドがあります。

0

本当に別のスレッドとコンテキストが必要ですか? 単一のGPU上の複数のコンテキストが十分なオーバーヘッドを持っているため、ベストプラクティスはGPUごとに1つのコンテキストを使用すると考えています。

多くのカーネルを同時に実行するには、1つのCUDAコンテキストでCUDAストリームをほとんど作成せず、各カーネルをそれぞれのストリームにキューイングする必要があります。そのため、十分なリソースがあれば同時に実行されます。

コンテキストをいくつかのCPUスレッドからアクセス可能にする必要がある場合は、cuCtxPopCurrent()、cuCtxPushCurrent()を使用してそれらを渡すことができますが、いつでもコンテキストで使用できるスレッドは1つだけです。

+0

複数のコンテキストを1つのGPUで同時にアクティブにできることを確認してください。 – Tariq

+0

@Tariq、私はそれを述べなかった)私はあなたが同時に2つのコンテキストで2つのコンテキストを持つ2つのプログラムを実行できることを確認することができますが、どちらもアクティブであるか、 – ShPavel

+0

http://stackoverflow.com/questions/31643570/running-more-than-one-cuda-applications-on-one-gpu – pgoetz

関連する問題