ふと思って、トレースキャッシュについてあまりよく知らなかったので資料を読んで勉強することにした。
読んだのは以下の本。古いけど基本的なことは網羅されており頼りになる。
9.5.3 高バンド幅のフェッチメカニズム
問題となるのはスーパスカラプロセッサが複数の命令を1サイクルでフェッチしなければならないということと、キャッシュラインをいくら広げても分岐が挿入されることにより有効なキャッシュライン幅が制限されるということ。分岐をまたいでなるべくたくさんの命令をフェッチしてきたいのだけれども、これが大変なのでいくつかの改善手法がある。
- Collapsing Buffer
- Trace Cache
9.4.3.1 The Collapsing Buffer
Collapsing Bufferの基本的な考え方は、命令キャッシュと分岐予測用のBTBをバンクに分割し、1サイクルで同時に複数の命令キャッシュにアクセスするということ。BTBの結果に基づいて分岐によって次に必要な命令キャッシュを特定し、ジャンプ先の命令キャッシュがもう片方のバンクに存在していればこれもフェッチしてしまう。
図9.33のように、複数のバンク間で同時にフェッチを行い、分岐命令でキャッシュをまたいでもまたいだ先もフェッチする。 さらに、後続のInterchange SwitchおよびCollapsing Circuitにより、フェッチした命令をシーケンシャルにくっつけることで、結果的に切れ目のない命令シーケンスを実現する。
Collapsing Bufferの弱点は、Interchange SwitchおよびCollapsing Circuitの論理が複雑になり遅延が増大することである。 Interchange Switchは巨大なクロスバネットワークを構築することにより多少負荷を削減できるが、Collapsing Circuitは看過できない遅延とステージを挿入することになり、分岐ペナルティも大きくなってしまう。
9.5.3.2 トレースキャッシュ
トレースキャッシュは、命令実行結果から、その命令の実行トレースを作り出すという発想である。分岐命令などを含んだ命令の実行結果をもとに各命令を論理的に結合し、物理的に連続的に配置することで、トレースキャッシュにヒットすると命令キャッシュにアクセスせずに命令を高速に供給できるようになる。
トレースの構築方法は2種類ある。一つは、フェッチ時に行うもの。分岐予測結果などを加味してトレースを生成する。この方法は2つ目の方法よりも早くトレースを生成できる。 2つ目の方法は命令コミット時にその結果をもとにトレースを作るもの。分岐予測結果などを参照する必要なく簡単だが、トレースが生成されるまでに最初の方法よりも時間がかかる。