分岐の分岐とそれを回避する方法について、インターネット上に散らばる多くの質問を見てきました。ただし、CUDA のしくみに関する記事を何十回も読んだ後でも、ほとんどの場合、分岐の分岐を回避することがどのように役立つかはわかりません。誰かが爪を伸ばして私に飛びかかる前に、私が「ほとんどの場合」と考えるものを説明させてください.
分岐分岐のほとんどのインスタンスには、多数の真に異なるコード ブロックが含まれているように私には思えます。たとえば、次のシナリオがあります。
if (A):
foo(A)
else:
bar(B)
この相違に遭遇した 2 つのスレッドがある場合、スレッド 1 が最初に実行され、パス A を使用します。次に、スレッド 2 がパス B を使用します。相違を取り除くために、上記のブロックを次のように変更します。
foo(A)
bar(B)
foo(A)
スレッド 2 とbar(B)
スレッド 1 で呼び出しても安全であると仮定すると、パフォーマンスの向上が期待できます。ただし、ここに私がそれを見る方法があります:
最初のケースでは、スレッド 1 と 2 が順次実行されます。これを 2 クロック サイクルと呼びます。
2 番目のケースでは、スレッド 1 と 2が並列に実行されfoo(A)
、次に並列に実行bar(B)
されます。これはまだ 2 クロック サイクルのように見えますが、違いは、前者の場合、foo(A)
メモリからの読み取りが含まれる場合、そのレイテンシー中にスレッド 2 が実行を開始できるため、レイテンシーが隠蔽されることです。この場合、分岐分岐コードの方が高速です。