0

CUDA のドキュメントでは、次のように 2 つのストリーム (stream0 と stream1) を使用する場合: stream0 でデータをコピーし、次に stream0 で最初のカーネルを起動し、stream0 でデバイスからデータを回復し、次に同じ操作がstream1で行われます。このように、本「CUDA by example 2010」で言及されているように、同時実行は提供されませんが、「同時カーネルサンプル」ではこの方法が使用され、同時実行が提供されます。では、2 つの例の違いを理解するのを手伝っていただけませんか?

4

2 に答える 2

2

オーバーラップ データ転送は、コンピューティング機能のバージョンやコーディング スタイルなど、多くの要因に依存します。このブログは、より多くの情報を提供する場合があります。

https://developer.nvidia.com/content/how-overlap-data-transfers-cuda-cc

于 2013-09-27T11:04:50.063 に答える
2

エリックの答えを拡張しているだけです。

CUDA C プログラミング ガイドでは、2ストリーム、たとえばstream0およびを使用stream1して次のことを行う例が報告されています。

ケースA

memcpyHostToDevice --- stream0
kernel execution   --- stream0
memcpyDeviceToHost --- stream0

memcpyHostToDevice --- stream1
kernel execution   --- stream1
memcpyDeviceToHost --- stream1

つまり、 のすべての操作stream0が最初に発行され、次に に関する操作が発行されstream1ます。同じ例が「CUDA By Example」本のセクション 10.5 で報告されていますが、この方法では同時実行性が達成されないと「明らかに」結論付けられています (ガイドとの「明らかな」矛盾で)。

「CUDA By Example」のセクション 10.6 では、ストリームの次の代替使用法が提案されています。

ケース B

memcpyHostToDevice --- stream0
memcpyHostToDevice --- stream1
kernel execution   --- stream0
kernel execution   --- stream1
memcpyDeviceToHost --- stream0
memcpyDeviceToHost --- stream1

つまり、 と のメモリ コピー操作とカーネル実行がインターレースされるようにstream0なりました。stream1この本は、このソリューションで同時実行性がどのように達成されるかを示しています。

実際、「CUDA By Example」本と CUDA C プログラミング ガイドの間に矛盾はありません。本での議論は特に GTX 285 カードを参照して行われているためです。引用されたブログ投稿How to Overlap Data Transfers in CUDA C/C++ では、依存関係と利用可能なコピー エンジンの結果として、異なるアーキテクチャで異なる方法で同時実行を実現できます。

たとえば、このブログでは、C1060 と C2050 の 2 つのカードを検討しています。前者には 1 つのカーネル エンジンと 1 つのコピー エンジンがあり、一度に 1 つのメモリ トランザクション (H2D または D2H) しか発行できません。後者には、1 つのカーネル エンジンと 2 つのコピー エンジンがあり、一度に 2 つのメモリ トランザクション (H2D と D2H) を同時に発行できます。コピー エンジンが 1 つしかない C1060 では、次のようになります。

ケース A - C1060 - 同時実行が達成されない

Stream       Kernel engine         Copy engine             Comment

stream0 ----                       memcpyHostToDevice ----
stream0 ---- kernel execution ----                         Depends on previous memcpy
stream0 ----                       memcpyDeviceToHost ---- Depends on previous kernel
stream1 ----                       memcpyHostToDevice ---- 
stream1 ---- kernel execution ----                         Depends on previous memcpy
stream1 ----                       memcpyDeviceToHost ---- Depends on previous kernel

ケース B - C1060 - 同時実行の達成

Stream         Kernel engine           Copy engine               Comment

stream0   ----                         memcpyHostToDevice 0 ----
stream0/1 ---- Kernel execution 0 ---- memcpyHostToDevice 1 ----  
stream0/1 ---- Kernel execution 1 ---- memcpyDeviceToHost 0 ---- 
stream1   ----                         memcpyDeviceToHost 1 ---- 

C2050 に関して、ストリームの場合を考慮すると3、CASE A では、C1060 とは逆に、同時実行が達成されるようになりました。

ケース A - C2050 - 同時実行の達成

Stream           Kernel engine           Copy engine H2D           Copy engine D2H

stream0     ----                         memcpyHostToDevice 0 ----
stream0/1   ---- kernel execution 0 ---- memcpyHostToDevice 1 ----                              
stream0/1/2 ---- kernel execution 1 ---- memcpyHostToDevice 2 ---- memcpyDeviceToHost 0
stream0/1/2 ---- kernel execution 2 ----                           memcpyDeviceToHost 1
stream2     ----                                                   memcpyDeviceToHost 2
于 2013-09-27T20:29:54.677 に答える