「SIMT」アーキテクチャの概念と設計のいくつかは、私にはまだ不明です。
多くのスレッドがロックステップで実行される可能性があるため、私が見て読んだことから、分岐コード パスと if() を完全に使用するのはかなり悪い考えです。では、それは正確には何を意味するのでしょうか。次のようなものはどうですか:
kernel void foo(..., int flag)
{
if (flag)
DO_STUFF
else
DO_SOMETHING_ELSE
}
パラメータ「フラグ」はすべてのワークユニットで同じであり、すべてのワークユニットで同じ分岐が取られます。では、GPU はすべてのコードを実行し、それにもかかわらずすべてをシリアライズし、基本的にまだ取られていないブランチを取るのでしょうか? それとも、もう少し賢く、すべてのスレッドが取られた分岐に同意する限り、取られた分岐のみを実行しますか? ここでは常にそうです。
つまり、シリアル化は常に行われますか、それとも必要な場合にのみ行われますか? 愚かな質問で申し訳ありません。;)