自作CPUの命令発行スケジューラをMatrix Schedulerに置き換えたくて、論文を読み直している。
Matrix Schedulerは行列のサイズが、命令ウィンドウの数だけ必要 (ROB 32エントリ x 5命令だと160x160くらいの行列が必要?) というのが基本だと思っていて、これを削減するためにIntelのMatrix Scheduler Reloadedを読み直している。
https://dl.acm.org/doi/10.1145/1250662.1250704
3. Picker
3.1 Background
- Schedulerのループの後半
- どの命令をディスパッチするのかを決定する。決定にはいくつかの要素を考慮する
- 競合の解決
- もっとも複雑。基本的に古い命令が若い命令よりも優先される
- 図7. に示すAge Matrixを使用する
- Age Matrix
- 行に対応する命令が列に対応する命令よりも古い場合は1、若い場合は0
- 他の命令がスケジューラに入ると、その命令に対応する列が0になる
- あれ、どっちがどっち?
- 図7. 命令Aと命令Cの解決例
- ① 命令Aと命令Bが発行要求 (Bids)を出す
- AのBidsは左から入り、グランドバックが発生する (ループバック)
- ② A / CはConflict出力を生成している
- ③ 命令Aは命令Cに依存性があるため、AのGrantはCによりキャンセルされる
- ④ 命令Cは命令Aに対する依存性が無く、CのGrantが出力される
- ① 命令Aと命令Bが発行要求 (Bids)を出す
- ただし、Age Matrixのサイズには限界がある
3.2 Age Tracking
- AgeベースのPickerの性能を確認するために、ランダムにPickするアルゴリズムを実装して性能を測定した
- 図8. 完全ランダムと疑似ランダムの相対的な性能
- スケジューラのエントリサイズに対してAgeの感受性に対して敏感である
- エントリが小さい場合には、ランダムにPickしても1%の性能低下
- ウィンドウが大きくなると、ランダムにPickすると10%の性能低下となる
- 128エントリになると、Ageに対する性能が飽和する
3.4 Hardware Modification
- 命令をグループ化することで緩やかな順番を作り出す
- グループ同士のAgeは追跡するが、グループ内のAgeは追跡しない
- 図10. グループ順を実装するためのハードウェアの変更点を示している
- スケジューラマトリックス
- 行: スケジューラエントリ
- 列: 命令グループ
- Pickerの列数を、60~90%程度減らすことが可能になる
- グループカウンタ
- 各命令にグループ番号を割り当てる
グループカウンタの値はPAT (Picker Allocation Table)によってインデックスされる
- グループがどのAge Matrixにも割り当てられていない場合、列番号がPicker Freelistから取り出される
- グループIDを列番号として使用すると、自由に列番号の割り当てができなくなってしまう
- FreelistのIDを使用して、列が順不同に割り当てられるようにした
図11. Picker Matrix Cellの変更点
- 列内で競合が発生したときにランダムに選択するArbiterが必要
- 優先度アービタを使用する