【ぶんきよそく】

分岐予測 とは?

最終更新:
💡 分岐先を予想し、命令の準備を先に進めるCPUの工夫

CPUが分岐の結果や行き先を確定前に予測し、その経路の命令を先に読み込む技術。分岐待ちの影響を減らす狙いがあり、投機的な実行につながる。予測が外れた場合は誤った経路の処理を取り消し、正しい経路へ戻る。

📌 このページのポイント
分岐先を予測し、結果が確定したら照合 分岐先を予測 履歴・命令など 命令を先読み 投機的に処理 分岐結果が確定 予測と照合 当たった場合と、外れた場合 予測と一致 正しい経路の結果を 確定できる 予測と不一致 誤った経路の結果を破棄 正しい経路で再開 誤経路の結果を破棄しても、キャッシュ等に 影響が残る場合がある(投機実行の注意点)
矢印は処理の順序。予測で進めた処理を、実際の分岐結果と照合する。
ひよこ ひよこ
分岐予測って何を予測してるの?
ペンギン先生 ペンギン先生
条件分岐で分岐するかどうかや、次に進む命令の位置を予測するよ。if文の分かれ道を先読みするのが一例。結果が確定する前に、その経路の命令を読み込み、CPUによっては実行も進めるんだ。
ひよこ ひよこ
結果を待つと何が困るの?
ペンギン先生 ペンギン先生
CPUは複数の命令を段階に分けて処理しているので、次の経路が分からないと命令の供給が滞ることがある。予測でその待ち時間の影響を減らすんだ。ただし当たっても、メモリ待ちなど別の理由で処理が止まることはあるよ。
ひよこ ひよこ
予測が外れたらどうなるの?
ペンギン先生 ペンギン先生
誤った経路の命令の結果は、プログラムの正式な結果として確定せず、正しい経路へ戻って処理するよ。余計な処理や再開の負担があるけれど、何クロック失うかはCPUや状況で変わる。先行したすべての命令を無条件に捨てる、という説明ではないんだ。
ひよこ ひよこ
どうやって予測してるの?
ペンギン先生 ペンギン先生
命令の情報などから判断する静的予測と、過去の実行履歴を使う動的予測があるよ。ArmのCortex-R8の説明では両方を使う。どの方法を組み合わせるかはCPUの設計によって違うんだ。
ひよこ ひよこ
最近のCPUならほとんど当たる?
ペンギン先生 ペンギン先生
予測しやすい規則的な分岐もあれば、結果が変わりやすい分岐もあるよ。精度はCPUと実行するプログラムに依存するので、一律の成功率では表せない。性能への影響も、対象の処理を測って考えるんだ。
ひよこ ひよこ
取り消した計算は何も残らないの?
ペンギン先生 ペンギン先生
プログラムの正式な結果に反映されなくても、キャッシュなどCPU内部の状態に影響が残る場合があるよ。その影響から秘密の情報を推測する攻撃がSpectreなどで問題になった。分岐予測と投機実行は関連するけれど、取り消しだけで情報漏えいを防げるわけではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「分岐予測」って出てきたら「分岐先を予想して、命令の処理を先に進めるための仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Branch Prediction」 = 分岐の予測
💬 branchは「枝」のことで、プログラムの実行経路が枝分かれするのを予測するから「分岐予測」と呼ばれるんだよ

参考資料

← 用語集にもどる