CUDAカーネルが含まれている場合、このような条件付きコード:CUDAと場合とそうでない場合
if (statement1)
calculation1;
else if (statement2)
calculation2;
else if (statement3)
calculation3;
それは計算がシリアライズされることを意味していますか?
CUDAカーネルが含まれている場合、このような条件付きコード:CUDAと場合とそうでない場合
if (statement1)
calculation1;
else if (statement2)
calculation2;
else if (statement3)
calculation3;
それは計算がシリアライズされることを意味していますか?
CUDAでの実行のシリアライズは、スレッドの単一のワープ内に分岐分岐がある場合に発生します。したがって、あなたの抽象的な例では、3つのステートメントのいずれかが、与えられたワープについて同じでないと評価された場合、3つの計算コードブロックのいくつかの組み合わせのブランチの分岐と命令の再生が行われ、そのワープのシリアル化。しかし、条件がワープレベルで同じであると評価される場合、シリアライズはありません。
あなたはこのようなものだったので、もしあなたはまた、CUDAでの条件付き実行があることを心に留めておく必要があります。
if (statement1)
calculation1;
end if
をstatement1
はワープ内のすべてのスレッドのために真実でなかった場合でも、そこではありません任意のシリアライゼーションではなく、ワープ内のスレッドの一部がNOOP
と同等の処理を実行するだけです。
したがって、コードの構造、条件を決定する入力データ、およびワープ間の条件の評価のグループ化によって、シリアル化が行われる場合とされない場合があります。一般的に、アーキテクチャーとコンパイラーは、多くの人が想像するよりも分岐の方がずっと寛容であり、分枝や条件を含む分かりやすく書かれたコードはわずかな(または無視できる)パフォーマンス上の不利益しか払わないでしょう。 CUDAプロファイラは、シリアライゼーションと命令の再生に関するかなりの情報を提供します。これは、特定のコードのパフォーマンスへの分岐の影響を理解するための主なガイドです。