FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Alpha 21264に関する論文を読む (5. メモリアクセスユニット)

Alpha 21264は非常に有名なプロセッサで、コンピュータアーキテクチャ系を生業とする者ならば必ず読んでおかなければならないものの一つに入る論文だと聞いている。が、私はまじめに読んだことが無いのでこの際きちんと理解しようと思う。

ieeexplore.ieee.org


アドレスと制御構造

メモリシステムの内部には、32エントリのLoad Queue(LDQ)と32エントリのStore Queue (STQ)が実装されており、インフライトなメモリアクセスを管理している。それぞれのエントリはフェッチの順番に割り当てられるが、発行する際はアウトオブオーダに発行される。ロード命令の場合は、ロード命令がリタイアして、ロードデータが書き込まれた後にフェッチの順番(インオーダ)でLDQから解放される。ストア命令は、データがキャッシュに書き込まれた後、フェッチの順番(インオーダ)でSTQから解放される。

命令が発行されると、古い命令に対してそのアドレスとAgeをチェックする。アドレスCAMにより、アウトオブオーダメモリアクセスに対してRAR, RAW, WAR, WAWのハザードを完全に解決する。

  • Read After Write : 欲しいデータを書き込む前にそのレジスタを読んでしまうこと
    • ストア命令実行時に、LDQのエントリをチェックし、若いロード命令がすでにデータを取得している場合にはそのロード命令を破棄しなければならない。
  • STQのCAMにより、投機的ストアデータバッファを制御し、古いストア命令の後に若いロード命令が発行された場合、ロードに投機的なストアデータをバイパスする。

図 8 は、両方のデータバス、データキャッシュ・タグ、およびデータキャッシュ・アレイ自体への両方のポートを含む、メモリシステムのスケジューリング例を示しています。9つのロードイシュー、L1-L9、9つのストアの一部、S1-S9、および3つのフィルの一部(それぞれ必要な64バイトを得るために4データバスサイクルを要する)、F1-F3が含まれています。ロードは、パイプラインステージ6でデータキャッシュのタグとアレイの両方を参照し、ロード結果はその1サイクル後のステージ7でデータバスを使用します。たとえば、図 8 では、ロード L6 と L7 は、13 サイクルでステージ 6(図 2)、14 サイクルでステージ 7 になっています。

図8は、メモリシステムのスケジューリングの例を示している。

  • L1からL9までのロード命令発行
  • S1からS9までのストア命令発行
  • F1からF3までのデータフィル

パイプラインステージ6において、データキャッシュを参照し、ロード結果はステージ7でデータバスに流される。図8においては、ロード命令6はステージ6にサイクル13で到達、サイクル14でステージ7に到達している。

図は本論文中より引用

ストア命令は、リタイアするまでキャッシュアレイを参照しない。S5はサイクル1でタグを参照するが、サイクル16までデータキャッシュに書き込まない。

フィルパターンは、サイクル0で到達し、サイクル1でストールした後サイクル2で書き込まれる。

この図におけるサイクル7, サイクル10、サイクル16は、それぞれ2つのストア命令が1つのストアデータにマージされる様子を示している。図のサイクル7ではS1とS2の書き込みが発生されているが、サイクル1~6はこの書き込みはストールされている。これは、サイクル1~6まではすべてフィルもしくはロード命令によりビジー状態になっているからである。

サイクル5でのロードL4とL5のキャッシュタグの使い方は特殊である。キャッシュのタグの参照をデータアレイおよびデータバスから切り離しているため、フィルが行われている間あいているキャッシュタグを活用する。これにより、ロード命令発行スロットのキャッシュアレイの参照とデータバス転送を分離することができ、不必要なキャッシュアクセスを排除することにより帯域幅を向上できる。

内部メモリシステムには、8エントリのMiss Address File(MAF)が実装されており、各エントリは64バイト単位でキャッシュブロックのミスを管理している。同じキャッシュブロックに対するロードストアのミスは、1つのMAFによりマージされる。かくMAFエントリは、L2キャッシュまたはシステムフィルが行われる。

AlphaはWeakly Memory Orderingであり、プラグラマがメモリバリア命令を挿入するときだけ、メモリアドレスへの順序付けが行われる。

キャッシュのプリフェッチと管理

メモリシステムには、キャッシュプリフェッチ命令が実装されている。ソフトウェアがメモリ参照を制御したい場合、関連する64バイトのキャッシュブロックをプリフェッチすることができる。