Issue Unitの構成を変更する作業を進めている。 Issue Unitはこれまでシーケンシャル割り当て(Cyclic Queue)をしていたが、これをどこからでも割り当て・開放が可能なQueueに変更する。
Issue Unitの変更点を考えながら、いろいろと思いを巡らせている。特に、Issue Selectをどのようにすればよいか、という点だ。
命令発行の優先度だが、依存を解決した命令のなかで、最も古い命令から選択するようにしたい。おそらくこれが理想だろう。
優先度について、これまで実装していたCyclic Queueでは、ポインタを用いた優先度選択をしていた。 つまり、Cyclic Queueなので最も古い命令というのはポインタで管理されており、それを基準にして古い命令から順に優先度をつけ、命令を選択する。
以下の図でいうならば、Entry[6]
からEntry[1]
までが有効なエントリで、発行優先度としてはEntry[6]が最も高く、Entry[1]が最も低い。
優先度順位付けは極めてシンプルだ。
では次に、Freelistを用いたランダム配置の場合はどうなるかというと、命令の年齢順に整列できていないので年齢順に発行するというのが難しくなる。 Age Matrixを導入して年齢を完全に管理しようかとも考えたが、そうするとIn-Order発行になってしまい、性能面で影響が出る。
ある程度雑にでもいいので、それぞれの順序関係を覚えておくのがいいような気がするのだが、うまい方法はあるかなあ?
現在のエントリ割り当てはFreelistを使っており、Listの順序は入れ替えることができないため、割り当て時の工夫というのはできない。 ランダムに割り当てられた中で、適切に選択する、というのが求められるわけだ。
論文もいくつか漁ってみている。ちょっとドキュメントをあさっていたら、いくつか文献を発見した。
- Un-Ordered Issue Queue:これはランダム割り当てに近いものだと思う。シンプルだが、適切な命令を選択できない場合が多い。
- Age-Ordered Issue QUeue:FIFOのようになっており、年齢的に並んでいる。途中の要素を発行することが可能で、空いた部分は後ろの命令をシフトすることで埋めていく。性能は出やすいが、複雑度が大きい。