[解決済み] なぜ、条件付の手は分岐予測失敗の影響を受けないのですか?
疑問点
読後感 この投稿 (StackOverflow での回答) (最適化のセクション) を読んで、私はなぜ条件付き移動が分岐予測失敗の影響を受けないのか不思議に思いました。私は の記事(AMD の PDF)を見つけました。 . そこでも、cond.moveのパフォーマンス上の優位性を主張しています。しかし、これはなぜでしょうか?私にはそれがわかりません。その ASM 命令が評価される瞬間には、先行する CMP 命令の結果はまだわかっていません。
どのように解決するのですか?
予測ミスによる分岐は高くつく
最近のプロセッサは、うまくいけば (前の命令やメモリから到着する命令のデータ依存を待つためにストールしなければ)、一般に各サイクルごとに 1 ~ 3 個の命令を実行します。
上記のステートメントはタイトなループに対して驚くほどよく機能しますが、これによって、サイクルが来たときに命令が実行されるのを妨げる可能性がある、1 つの追加の依存関係に目をつぶってはいけません。 ある命令が実行されるには、プロセッサがその命令のフェッチとデコードを 15 ~ 20 サイクル前に開始していなければなりません。
分岐に遭遇したとき、プロセッサはどうすればよいのでしょうか。両方のターゲットをフェッチおよびデコードすることはスケールしません (さらに分岐が続くと、指数関数的に多くのパスを並行してフェッチする必要があります)。そこで、プロセッサは2つの分岐のうち1つだけをフェッチし、投機的にデコードします。
効率的な命令パイプラインによって通常は見えない 15 ~ 20 サイクルのコストがかかるのです。
条件付き移動は決して高価ではない
条件付き移動は予測を必要としないので、このペナルティが発生することはありません。通常の命令と同じようにデータ依存性があります。実際には、条件付き移動は通常の命令よりも多くのデータ依存性を持ちます。なぜなら、データ依存性には「条件真」と「条件偽」の両方のケースが含まれるからです。条件付きで移動する命令の後に
r1
を
r2
の内容は
r2
の前の値の両方に依存しているように見える。
r2
と
r1
. うまく予測された条件分岐により、プロセッサはより正確な依存関係を推論することができます。しかし、データの依存関係は、到着に時間が必要な場合でも、通常1~2サイクルの時間がかかります。
メモリからレジスタへの条件付き移動は、時には危険な賭けであることに注意してください。メモリから読み込んだ値がレジスタに代入されないような条件であれば、何もせずにメモリで待機したことになります。しかし、命令セットで提供される条件付き移動命令は、一般的にレジスタからレジスタであり、プログラマ側のこのような間違いを防ぐことができます。
関連
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] forループの中で<と<=のどちらを使うべきか [閉じた状態].
-
[解決済み] Scalaのパターンマッチはバイトコードレベルでどのように実装されているのですか?
-
[解決済み] ファイルキャッシュをクリアしてパフォーマンステストを繰り返す
-
[解決済み] OFFSET / FETCH NEXTからの総行数取得
-
[解決済み] なぜSSEスカラーsqrt(x)はrsqrt(x) * xより遅いのですか?
-
[解決済み] Entity Frameworkのクエリは遅いが、SqlQueryの同じSQLは速い。
-
[解決済み] translateZ(0)に対するCSSのパフォーマンス
-
[解決済み] RustのOption型のオーバーヘッドとは?
-
[解決済み] 原子演算コスト
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] forループの中で<と<=のどちらを使うべきか [閉じた状態].
-
[解決済み] CUDAカーネルのグリッドとブロックの寸法はどのように選択するのですか?
-
[解決済み] Scalaのパターンマッチはバイトコードレベルでどのように実装されているのですか?
-
[解決済み] なぜSSEスカラーsqrt(x)はrsqrt(x) * xより遅いのですか?
-
[解決済み] translateZ(0)に対するCSSのパフォーマンス
-
[解決済み] Rでdata.frameをマージ/ジョインする最速の方法は何ですか?
-
[解決済み] RustのOption型のオーバーヘッドとは?
-
[解決済み] EBPフレームポインタレジスタの目的は何ですか?
-
[解決済み] 開発者は読みやすさとパフォーマンスのどちらを優先させるべきか?[クローズド]
-
[解決済み] 原子演算コスト