2012-02-16 19 views
6

CUDAカーネルに異なるストリームを使用すると、並列カーネルの実行が可能になります。したがって、nカーネルのnストリームは理論的にはハードウェアにフィッティングしている場合は同時に実行できますか?ストリームごとに複数のカーネルを持つCUDA同時カーネル実行

今私は以下の問題に直面しています:nの異なるカーネルがありませんが、n*mのカーネルは、順番に実行する必要があります。mインスタンスn=2m=3ためのストリームと次の実行スキームをもたらす:

Stream 1: <<<Kernel 0.1>>> <<<Kernel 1.1>>> <<<Kernel 2.1>>> 
Stream 2: <<<Kernel 0.2>>> <<<Kernel 1.2>>> <<<Kernel 2.2>>> 

マイナイーブ仮定はカーネルX.0とy.1は、少なくとも(図の理論的観点から)を同時に実行したりすべきであるということです連続的ではない(実践的な観点から)。しかし、私の測定結果によると、これは当てはまらず、連続実行が行われているようです(つまり、K0.0、K1.0、K2.0、K0.1、K1.1、K2.1)。カーネル自体は非常に小さいので、同時実行は問題ではありません。

私のアプローチは、カーネルがインターリーブされたスタイルでGPUのスケジューラにエンキューされていることを確認するための一種のディスパッチを実現することです。しかし、多数のストリーム/カーネルを扱う場合、これは良いよりも害を及ぼす可能性があります。

申し訳ありませんが、この状況を解決する適切な(または少なくとも異なる)アプローチは何でしょうか?

編集:測定はCUDAイベントを使用して行われます。私は計算を完全に解決するために必要な時間を測定しました。 e。 GPUはすべてのn * mカーネルを計算しなければなりません。完全な並列カーネル実行では、すべてのカーネルを順番に実行するのに必要な時間はおおよそ(理想的には)1/n回であり、これにより2つ以上のカーネルを同時に実行できる必要があります。私は今、2つの異なるストリームを使用してこれを保証しています。

説明したようにストリームを使用してインターリーブされたカーネルをディスパッチする間の実行時間に関する明確な違いを測定できます。

Loop: i = 1 to n 
    Loop: j = 0 to m 
     EnqueueKernel(Kernel j.i, Stream i) 

長いランタイムに後者のリード線対E:

Loop: i = 0 to m 
    EnqueueKernel(Kernel i.1, Stream 1) 
    EnqueueKernel(Kernel i.2, Stream 2) 

編集番号2:ストリーム番号を1(0の代わりに、下記のコメントを参照)に変更しました。

編集#3:フェルミ(別名計算能力2.0)ハードウェアオンウェアNVIDIAのTesla M2090(すなわちフェルミ、計算能力を2.0)である

+0

必要な実行順序を強制するには、ストリーム同期プリミティブを使用する必要があります。しかし、あなたの質問であなたの測定をどのようにしたら少し拡張することができますか?あなたは "Stream 0"を書くときに、文字通りCUDAストリーム0を意味しないことを確認できますか? – talonmies

+0

私は測定値を明らかにしました(少なくとも私はそう望みます)。ストリームでは、私は[CUDA Cプログラミングガイド](http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf)で説明されているように、 'cudaStream_t'のインスタンスを意味しています。 3.2.5項(非同期同時実行)を参照してください。 –

+2

ストリーム0(デフォルトストリーム)が同期しているため、あなたのストリームCUDAストリーム0の1つが私が求めていたことを誤解している可能性があります。 – talonmies

答えて

5

それはカーネルをインターリーブすることが最良であるが、複数のストリームにではなく、に起動します十分なリソースがあれば、ハードウェアはすぐに別のストリームにカーネルを立ち上げることができるからです。後続の起動が同じストリームに対して行われると、遅延が導入され、並行性が低下することがよくあります。これが、最初のアプローチが優れたパフォーマンスを発揮する理由です。このアプローチは、選択する必要があります。

プロファイリングを有効にすると、フェルミの並行性も無効になる可能性がありますので、注意してください。また、起動ループ中にCUDAイベントを使用する際に注意してください。干渉する可能性があります。

+0

あなたはこの知識(第1段落の中で、第2段落ではない)がどこに由来するかを私に知らせることができますか? –

+0

CUDA 4.1プログラミングガイドの第3章には情報があります。しかし、それを読んだ後、私はそれが明示的に "インターリーブカーネルの起動"とは言いません。私は、NVIDIA CUDAソフトウェアチームの同僚からの情報を得ました。 – harrism

+0

ありがとうございます。私は自分のコードを再訪し、できるだけ多くの情報や更新を提供するつもりです。 –

関連する問題