分岐予測
GShare方式
-- これが重要
PHTのインデクス = address EXOR history
glanch history table はglobal(1本)
96%あたる
もっとあてたい
ハイブリッド仏寄与即
・ローカル履歴予測方式とグローバル予測方式の組み合わせ
・どちらで予測するのがよいかの選択に関する予測器
信頼度ヵウンタ
4bitくらいの短いはんいにしておくで、直近32bitで一番信頼できる
ものにしておくとか。
・DEC Alpha21264
予測器の方式は、分岐だけでなく
・メモリアドレス予測
・値予測
でも使用される
今日、最高の分岐予測
1. ハイブリッドを高度化
TAGE, GALE
3. パーセプトロン予測器
信頼度ヵウンタの代わりに、ニューラルネットワークをおいて、
どの分岐予測器を使うかを選択する
2. Path Based 予測器
だいたい99%
VLIWもまけた
いくらエントリを増やしても、方式が同じだとあまり変わらない
動的スケジューリングの理想形態
基本方式
・集中制御方式:スコアボード方式
WARハザードの解消(Write after read)
レジスタ・リネーミングとともに用いれば、WAWハザードの解消
・分散制御方式
各演算器にリザーベーション・ステーション(依存関係をとるハードウェア)を設置
命令ウィンドウ内はデータ依存関係だけに従って実行
自然なWAWハザード、WARハザードの解消
トマスロのアルゴリズム
今日のプロセッサの大半はこれを用いている。
・スーパースカラ方式
基本ブロック内(分岐と分岐の間)の並列実行
レジスタ・リネーミングを用いれば、WAWハザード、WARハザードの解消
スコアボード方式
・CPU構成の前提
- 複数(かつマルチサイクル)演算器
- 複数ポートを持つレジスタ・ファイル
- 多くの場合、複数のメモリポート
- 実行フェーズでの複数命令の同時実行
いくつかの命令を同時に実行できる
・スコアボードの構成例
1. 命令状態表
各命令が命令実行のどの段階かを示す
2. 演算ユニット状態表
演算ユニットの状態依存関係を表す
BUSY : 演算ユニットがbusy or idle
OP: 実行する演算
rdi: デスティネーション・レジスタ番号
rs, rsk: ソースレジスタ番号
Qi. Qk: ソースレジスタrsi, rskの値を生成する演算ユニット番号
Ri, Rk: ソースレジスタrsi, rskの値が有効
データ依存関係がグラフとして得られる
3. レジスタ書き込み予約表
各レジスタにつき、書き込みを行う演算ユニット
予約している人は誰か?
スコアボード実行の手順
1. 命令発行
・当該命令が使用する演算ユニットがbusyでない
・現在実行中の命令とディスティネーションレジスタが一致しない
・命令キューに秋がある
場合に、1命令、命令を発行し、命令キュー(と命令状態表)に挿入
・この操作により、WAWハザードと構造ハザードがないことを保証
2. オペランド読み出し
・ソースオペランドが使用可の場合、オペランドをレジスタから読み出す
・使用可 → 実行中命令により該当レジスタの書き込みが予約されていない
・ソースオペランドが使用不可の場合、そこへの書き込みが予約されている機能ユニットから書き込みが終了するとオペランドを読み出す
3. 実行
・演算ユニットは、ソースオペランドが揃ったら実行を開始する
・演算ユニット実行が終了したら、それをスコアボードに通知
4. 結果書き込み
・演算ユニットから命令実行の終了を通知されると、スコアボードでwarハザードのチェックを行う
・warハザードが検出されると、解消されるまで書き込みを遅延される
・バイパスが行われない
理解するとやさしい
スコアボード方式の特徴
・書き込み順序の変更を許さないため、WAWハザードにより遅延発生
・WARハザード防止のため、遅延発生
レジスタ・リネーミング
・スコアボードのハードウェア量は少ない
・トマスロのアルゴリズムがいい
トマスロのアルゴリズム
・実行中命令は、命令間で直接データを授受する
・リザベーションステーションによる、分散制御方式
・WAR, WAWハザードの解消
・IBM360/91で、高度な浮動小数点計算の実現
- 少ない浮動小数点レジスタを補う
- ハードウェアによるループのアンローリング
・演算ユニット間のデータ直接授受(バイパス)による高速化
リザーベーションステーション
busy リザベーション・ステーションのエントリ使用中
op 演算ユニットの演算内容
qj qk jまたはkオペランドを生成する演算ユニットのリザベーションステーション番号
vj vk
1. 命令発行
・リザベーションステーションのエントリに空きがあり、構造ハザードが発生しない場合、命令を発行し、演算スタックに入れる
・ソース・オペランドがレジスタ上に存在する場合(即ち、書き込み予約が行われていない場合)、レジスタのデータもリザベーションステーションに格納
・ロード・ストア命令の場合、ロードバッファ、ストアバッファに空きエントリがあれば命令実行
2. 実行
・リザベーションステーション上にすべてのオペランドが存在する場合、
命令を演算ユニットが飽き次第直ちに実行
・もっている場合
3. 結果の書き込み
パイプライン方式と割り込み
・割り込みはパイプライン方式により著しく複雑化
- 命令順序と、CPU内部での実行順序は不一致
- パイプラインの各ステージで割り込み要因の検出
- 割り込み原因ごとの優先度
- 割り込み時の振る舞いと、パイプライン構成の独立性
- 割り込みからの再開可能性の確保
- 遅延分岐スロット中での割り込み
基本方式
・各ステージにおける割り込み要因を、パイプラインレジスタを介して、後段に伝達
・レジスタ、メモリ書き込みの直前に割り込みを検査
・実行中止の割り込みが検出されると、レジスタ、メモリ書き込みを抑制
・途中のパイプリアンステージで状態を変更する場合には、
- 変更前の状態を確保するヒスとリファイルを作成、または
- 変更後の状態を、一時的にフューチャーファイルに作成し、書き込みステージで確定
割り込み設計は難しい
正確な割り込み
・完全な逐次命令と同一の割り込みの振る舞いを示す
- 割り込み前の命令はすべて完全に終了
- 割り込み後の命令はすべて実実行
- 再開後に、割り込みの影響がない
・In order issue, in order completionではwステージに割り込み処理を集中
・Oput of Order completionでは、書き込みをリオーダーバッファに対して行い、
本当のコミットはin orderで実現する。
・Out of order issueの場合には、すべての状態をヒスとリファイルかフューチャーファイルを介して更新
遅延スロット中の割り込み処理
・遅延スロット中の割り込み
- 完了の場合の次分岐先が失われる
- PCを2種類と、遅延分岐中のフラグのたん日が必要
・遅延スロットが1個の場合の特例
- 完了でも、分岐命令から再実行
- 分岐命令がpc意外を変更しない
不正確な割り込み
・パイプライン制御を前提として、異なる割り込みモデルを与える
・割り込みが検出されると、直ちに割り込み動作開始
・不正確な割り込みを実用化する方法
1. 上記問題点を無視し、エラーの発生だけを通知する
- IEEEの浮動小数点の完全な実現が不可能になる
同期命令をいれる
2. ヒストリファイル、フューチャーファイルの使用
あとで読めるようにしておく
3. ソフトウェアによる命令エミュレーション
凍らせて、ソフトウェア
ソフトウェアとあわせて見ると、正確
今は正確な割り込みをする
命令セット設計との関係
・大きな影響
- 命令が変更するCPU状態を限定する必要性
・マルチサイクル命令
- 命令の実行中割り込みを実現する機構が必王
・レジスタ音オートインクリメント、オートデクリメント
- パイプラインおんW以前のフェーズでおんレジスタ値変更が必要
- 命令内にデータ依存関係、データ逆依存関係が発生
最近はない
・割り込み原因検出命令
- 浮動小数点演算例外を、明示的に検出する
・3オペランド、ロード/ストア命令形式普及の原因
ロード/ストアを分ける
ベクトル計算機の割り込み