一般的な分岐はパフォーマンスに影響しませんが、分岐はの相違です。つまり、2つのスレッドが異なるパスを使用しています(たとえば、1つが条件を満たしていて、もう1つは条件を満たしていません)。 GPUのすべてのスレッドが同じ「コード行」を実行するため、パスの一部ではないコードが実行されている間にスレッドが待機する必要があります。
1つのワープ(NVIDIA)または波面(AMD)のすべてのスレッドのみが同じ「コード行」を実行するので、実際にはそうではありません。 (現在、NVIDIA GPUのワープサイズは32、AMD GPUの最大サイズは64です。)
カーネルにif-else
ブロックがあると、最悪の場合のシナリオは実際には50%の性能低下です。さらに悪いことに、n
分岐がある場合、パフォーマンスは分岐なしのパフォーマンスの1/n
に減少する可能性があります(分岐がないか、ワープ/ウェイフエンドのすべてのスレッドが同じパスを使用しています)。もちろん、このようなシナリオでは、カーネル全体をif-else
(またはswitch
)の構造体に埋め込む必要があります。
しかし、これは、異なるパスを取っているスレッドが同じワープ/ワーフフェンスにある場合にのみ発生します。できるだけ分岐の発散を避けるために、コードを書いたり、データを並べ替えたり、アルゴリズムを選択したりするのはあなた次第です。
Tl; DR:ブランチが存在する可能性がありますが、異なるスレッドが異なるブランチを使用している場合は、分岐とそれに伴うパフォーマンスの低下を避けるために、異なるワープ/ウェファフロントでなければなりません。
GPUの設計は本質的に分岐操作を好まないので、コードをこの特性に適合させることを検討する必要があります。 – tibetty