ほとんどの場合、次のような CUDA または OpenCL プログラムでブランチが必要です。
for (int i=0; i<width; i++)
{
if( i % threadIdx.x == 0)
quantity += i*i;
}
コードは常に (または少なくともほとんどの場合) 非分岐スタイルで書き直すことができます。
for (int i=0; i<width; i++)
{
quantity += i*i* (i % threadIdx.x != 0);
}
トレードオフは、単一のワープ スロットで実行するか、すべてのスレッドでより多くの計算を実行するかのいずれかのようです (2 番目のケースでは、合計が常に実行されますが、値がゼロになることもあります)。
分岐操作では、可能な分岐ごとに複数のワープ スロットが必要であると仮定すると、2 番目の方が一貫して最初よりも優れていることが予想されます。私の質問は次のとおりです。コンパイラが 1) を 2) に最適化するのが理にかなっている場合、または広く適用できる基準がない場合はコンパイラに頼ることができますか?