The 'select' instruction is used to choose one value based on a condition, without branching.
分岐命令と選択命令の違いを知りたい(できればx86アーキテクチャとPTXの両方)。私の知る限り、select
分岐命令に比べて最適ですが、明確な画像はありません。
The 'select' instruction is used to choose one value based on a condition, without branching.
分岐命令と選択命令の違いを知りたい(できればx86アーキテクチャとPTXの両方)。私の知る限り、select
分岐命令に比べて最適ですが、明確な画像はありません。
分岐は、制御フローをリダイレクトするために使用される汎用メカニズムです。ほとんどの形式のif
ステートメントを実装するために使用されます (特定の最適化が適用されない場合)。
選択は、いくつかの形式の条件式を実装できる一部の命令セットで使用できる特殊な命令です。
z = (cond) ? x : y;
また
if(cond) z = x;
ただし、x
とy
は単純な値です (式の場合、select の前に両方を計算する必要があり、パフォーマンスの低下や不適切な副作用評価が発生する可能性があります)。このような命令は必然的に分岐よりも制限されますが、命令ポインターが変更されないという明確な利点があります。その結果、プロセッサは、分岐の予測ミスでパイプラインをフラッシュする必要がありません (分岐がないため)。このため、select 命令 (使用可能な場合) の方が高速です。
CUDA などの一部のスーパースカラー アーキテクチャでは、並列ユニットが完全に同期された状態を維持する必要があるため、ブランチはパフォーマンスの面で非常に高価です。たとえば、CUDA では、ブロック内のすべての実行ユニットが同じ実行パスを取る必要があります。1 つのスレッドが分岐すると、すべてのユニットが両方の分岐を通過します (ただし、実行されなかった分岐では操作は実行されません)。ただし、select 命令では、この種のペナルティは発生しません。
cmov
ほとんどのコンパイラは、適切なオプションを使用すると、単純なif
ステートメントが与えられた場合のように、「select」スタイルの命令を生成することに注意してください。また、場合によっては、ビット単位の操作または論理演算を使用して、分岐を実行せずにブール条件と式の値を組み合わせることができます。