CUDA のドキュメントでは、次のように 2 つのストリーム (stream0 と stream1) を使用する場合: stream0 でデータをコピーし、次に stream0 で最初のカーネルを起動し、stream0 でデバイスからデータを回復し、次に同じ操作がstream1で行われます。このように、本「CUDA by example 2010」で言及されているように、同時実行は提供されませんが、「同時カーネルサンプル」ではこの方法が使用され、同時実行が提供されます。では、2 つの例の違いを理解するのを手伝っていただけませんか?
2 に答える
オーバーラップ データ転送は、コンピューティング機能のバージョンやコーディング スタイルなど、多くの要因に依存します。このブログは、より多くの情報を提供する場合があります。
https://developer.nvidia.com/content/how-overlap-data-transfers-cuda-cc
エリックの答えを拡張しているだけです。
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