コンピュータアーキテクチャの論文を読んでいたのだが、どうもよく知らない項目がある。 よく考えてみたらコンピュータアーキテクチャの最新トレンドも含め最近勉強量が不足していたので、ここらへんでもう一度復習しておきたい。 せっかくなので海外の大学の講義資料を読んでみよう。
- Advanced Computer Architecture
https://www.ece.ucsb.edu/~strukov/ece154BSpring2018/home.htm
目次
- 1. 半導体のトレンドと背景
- 2.半導体の性能向上
- 3.半導体の性能向上
- 4. キャッシュ階層
- 5. キャッシュ階層
- 6. 高度なキャッシュ最適化
- 7. ILPの向上テクニック
- 8. ILPの向上テクニック, Tomasuloのアルゴリズム
- 9. 分岐予測
- 10. 複数命令発行の技術
Advanced Computer Architecture
5. 制御ハザードの処理
もっとも単純な制御ハザードの解決方法は、分岐のターゲットアドレスが解決するまでストールを挿入すること。しかし、こうしてしまうと動的スケジューリングに大きな影響が発生してしまう。とりあえずはループアンローリングを行うことで性能の低下を防ぐことができる。
別の方法としては、「遅延分岐」を挿入するという方法がある。分岐命令を実行した後に、1命令だけ遅延分岐命令を挿入することでストールを隠蔽する。MIPSは遅延分岐を採用しており、分岐命令を実行してもすぐにジャンプせず、後続の1命令を実行すことで分岐の遅延を隠蔽する。
もう一つの方法としては性的に分岐方向を予測するというもの。分岐を動的に予測するのではなく、
- 常にTaken/Not Takenとして予測する (予測が外れたときに復帰する機能が必要となる)
- よりより良い性能を得るためにプロファイリングを実行し、明示的に分岐方向を命令に埋め込む。
動的分岐予測
実行中に分岐方向を予測する方式。
- 1ビットか2ビットの分岐予測
- 各分岐命令において、Taken/Not Takenを予測する。もし分岐予測の結果が外れていれば、分岐方向を変える。
- 相関分岐予測・2レベル分岐予測
- 2ビットの分岐予測器をもっており、過去の$n$ビットの分岐の結果から次の分岐を予測する。
- 局所分岐予測器
- 各分岐に対して2ビットの分岐予測器をもっており、過去の$n$回の分岐結果を組み合わせて次の分岐を予測する。
- トーナメント分岐予測
- 相関分岐予測と局所分岐予測を組み合わせる。
分岐の履歴を保存するためにBHT(Branch History Table)を使用する。PCの下位のビットを使用して、1ビット値を格納する。過去の$n$回のビットがTaken/Not Takenなのかを格納している。このBHTではすべてのアドレスをチェックしない。
1ビットのBHTでは、2回の分岐予測ミスが発生する可能性がある。
ループの最後に、これまでのループ判定とは異なる結果が発生することで分岐予測ミスが発生する。そして次に同じループに入った時に、再びループ判定で分岐予測ミスを発生させてしまう。
そこで、2ビットの分岐予測を導入する。
2ビットの分岐予測器を使用して、BHT内に2ビット分岐予測器を格納しておく。分岐命令のフェッチ時にBHTを使用して分岐予測を行う。分岐命令が完了した時点で、BHT内の当該分岐命令のテーブルをアップデートする。
もう一つの方法は、分岐予測ミスが2回発生すると分岐の予測を変更する方式である。
相関分岐予測
以下のようなプログラムを考える。B3は、B1とB2が成立する場合には必ず成立する。過去の分岐命令の情報に基づいて分岐予測を行う。
現在の分岐命令の動作は、過去に実行した分岐命令の結果に基づいているケースがある。過去の4つの分岐命令を使用して現在の分岐予測を実行する。
(2, 2)分岐予測器は、2ビットのグローバル分岐予測と、2ビットのローカル分岐予測を使用する。
それぞれの分岐予測器の精度
グローバル分岐予測とローカル分岐予測について
- ローカル分岐予測。BHT(Branch History Table)を使用する。PCのビットを元にしてエントリを選択する。
トーナメント分岐予測
相関分岐予測は、2ビットのローカル分岐予測が重要な分岐で失敗する場合に、グローバルな情報を挿入することで性能を向上させる。一方でトーナメント分岐予測は2つの分岐予測を使用する。
- グローバル情報を使用する分岐予測器
- ローカル情報を使用する分岐予測器
正しい分岐予測を選択して、正しく分岐することが目的。
分岐予測の精度。トーナメント分岐予測に対するローカル分岐予測の予測精度
分岐予測精度
分岐予測精度とサイズ
BHT : 分岐アドレスを格納するためのテーブル
Branch Targett Buffer(BTB):分岐命令のジャンプ先のアドレスを保存する。分岐命令のアドレスをマッチさせる必要性がある。そうでなければ誤った分岐アドレスを選択してしまう。
BHTの選択フローは以下のようになる。
関数呼び出しのためぬ分岐予測:Return Address Stack
戻り先の関数をスタックに格納しておく。