1. ホーム
  2. performance

[解決済み] なぜ、条件付の手は分岐予測失敗の影響を受けないのですか?

2023-02-25 12:21:21

疑問点

読後感 この投稿 (StackOverflow での回答) (最適化のセクション) を読んで、私はなぜ条件付き移動が分岐予測失敗の影響を受けないのか不思議に思いました。私は の記事(AMD の PDF)を見つけました。 . そこでも、cond.moveのパフォーマンス上の優位性を主張しています。しかし、これはなぜでしょうか?私にはそれがわかりません。その ASM 命令が評価される瞬間には、先行する CMP 命令の結果はまだわかっていません。

どのように解決するのですか?

予測ミスによる分岐は高くつく

最近のプロセッサは、うまくいけば (前の命令やメモリから到着する命令のデータ依存を待つためにストールしなければ)、一般に各サイクルごとに 1 ~ 3 個の命令を実行します。

上記のステートメントはタイトなループに対して驚くほどよく機能しますが、これによって、サイクルが来たときに命令が実行されるのを妨げる可能性がある、1 つの追加の依存関係に目をつぶってはいけません。 ある命令が実行されるには、プロセッサがその命令のフェッチとデコードを 15 ~ 20 サイクル前に開始していなければなりません。

分岐に遭遇したとき、プロセッサはどうすればよいのでしょうか。両方のターゲットをフェッチおよびデコードすることはスケールしません (さらに分岐が続くと、指数関数的に多くのパスを並行してフェッチする必要があります)。そこで、プロセッサは2つの分岐のうち1つだけをフェッチし、投機的にデコードします。

効率的な命令パイプラインによって通常は見えない 15 ~ 20 サイクルのコストがかかるのです。

条件付き移動は決して高価ではない

条件付き移動は予測を必要としないので、このペナルティが発生することはありません。通常の命令と同じようにデータ依存性があります。実際には、条件付き移動は通常の命令よりも多くのデータ依存性を持ちます。なぜなら、データ依存性には「条件真」と「条件偽」の両方のケースが含まれるからです。条件付きで移動する命令の後に r1r2 の内容は r2 の前の値の両方に依存しているように見える。 r2r1 . うまく予測された条件分岐により、プロセッサはより正確な依存関係を推論することができます。しかし、データの依存関係は、到着に時間が必要な場合でも、通常1~2サイクルの時間がかかります。

メモリからレジスタへの条件付き移動は、時には危険な賭けであることに注意してください。メモリから読み込んだ値がレジスタに代入されないような条件であれば、何もせずにメモリで待機したことになります。しかし、命令セットで提供される条件付き移動命令は、一般的にレジスタからレジスタであり、プログラマ側のこのような間違いを防ぐことができます。