CUDAカーネルに異なるストリームを使用すると、並列カーネルの実行が可能になります。したがって、n
カーネルのn
ストリームは理論的にはハードウェアにフィッティングしている場合は同時に実行できますか?ストリームごとに複数のカーネルを持つCUDA同時カーネル実行
今私は以下の問題に直面しています:n
の異なるカーネルがありませんが、n*m
のカーネルは、順番に実行する必要があります。m
インスタンスn=2
とm=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)である
必要な実行順序を強制するには、ストリーム同期プリミティブを使用する必要があります。しかし、あなたの質問であなたの測定をどのようにしたら少し拡張することができますか?あなたは "Stream 0"を書くときに、文字通りCUDAストリーム0を意味しないことを確認できますか? – talonmies
私は測定値を明らかにしました(少なくとも私はそう望みます)。ストリームでは、私は[CUDA Cプログラミングガイド](http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf)で説明されているように、 'cudaStream_t'のインスタンスを意味しています。 3.2.5項(非同期同時実行)を参照してください。 –
ストリーム0(デフォルトストリーム)が同期しているため、あなたのストリームCUDAストリーム0の1つが私が求めていたことを誤解している可能性があります。 – talonmies