gem5のサイクル精度モデルについて理解したいので、O3CPUのドキュメントを読んでみることにする。
次に、メモリサブシステムについてドキュメントを読み進めていく。
本ドキュメントでは、gem5のメモリサブシステムについて、CPUでの単純なメモリアクセス(読み込み・書き込み)に焦点を当てて説明する。
モデルの階層構造
gem5は、メモリシステムを構築するための基本ブロックとして、シミュレーションオブジェクトの派生オブジェクトを使用する。これらは、確立されたマスターとポートを介して接続されている。
CPU
データキャッシュオブジェクトは、標準的なキャッシュ構成を実装している。
O3 CPUモデルについて詳しく説明することはこのドキュメントの範囲ではないので、ここではモデルに関するいくつかの関連する注意点のみを述べる:
Readアクセス:DCacheオブジェクトに向けてポートにメッセージを送信することで開始される。DCacheがメッセージを拒否した場合(ブロックされているかビジーであるため)、CPUはパイプラインをフラッシュし、アクセスは後で再試行される。DCacheからの応答メッセージ(ReadRep)を受け取ると、アクセスは完了する。
Writeアクセス:Tickごとにコンテキストが空になりDCacheに送られるストア・バッファに要求を格納することで開始される。DCacheはリクエストを拒否することもできる。書き込みアクセスは、書き込み応答(WriteRep)メッセージがDCacheから受信されると完了する。
ロード&ストア・バッファ(読み取りおよび書き込みアクセス用)は、アクティブなメモリ・アクセス数に制限を課さない。したがって、CPUのメモリアクセス要求の最大数は、CPUシミュレーションオブジェクトによって制限されるのではなく、基本的なメモリシステムモデルによって制限される。
分割メモリアクセスが実装されている。
CPUが送信するメッセージには、アクセスされた領域のメモリタイプ(Normal, Device, Strongly Ordered, Cacheablitiy)が含まれる。しかし、これは、メモリタイプに対してより単純化されたアプローチをとるモデルの他の部分では使用されない。
データ・キャッシュ・オブジェクト
Data Cacheオブジェクトは標準的なキャッシュ構造を実装している:
Cached Memory Read:特定のキャッシュ・タグ(ValidフラグとReadフラグを持つ)に一致する場合は、configurableな時間の後に(ReadRespをCPUに送信することによって)完了する。そうでない場合、要求は Miss Status and Handling Register(MSHR)ブロックに転送される。
Cached Memory Write:特定のキャッシュ・タグ(Valid、Read、Write フラグを持つ)に一致する場合は、同じConfigurableな時間後に(CPU に WriteResp を送信することによって)完了する。そうでない場合、要求は Miss Status and Handling Register(MSHR)ブロックに転送される。
Uncached Memory Read : は MSHR ブロックに転送される。
Uncached Memory Write : はWriteBufferブロックに転送される。
Evicted (& dirty) cache lineはWriteBufferブロックに転送される。
以下のいずれかに当てはまる場合、CPUのデータ・キャッシュへのアクセスはブロックされる:
- MSHRブロックが満杯である。(MSHRのバッファ・サイズは設定可能である)。
- ライトバック・ブロックがフルである。(ブロックのバッファサイズは設定可能である)。 同じメモリ・キャッシュ・ラインに対する未処理のメモリ・アクセスの数が、設定可能な閾値に達している。
- ブロック状態のデータ・キャッシュは、スレーブ・ポート(CPU)からのいかなるリクエストも、それがキャッシュ・ヒットまたはミスになるかどうかに関係なく拒否する。マスター・ポートからのメッセージ(レスポンス・メッセージやスヌープ・リクエスト)は拒否されない。
Uncachedなメモリ領域にキャッシュ・ヒットした場合(ARM ARMによれば予測されていない動作)、キャッシュ・ラインは無効になり、メモリからデータがフェッチされる。
Tag と Data Block
キャッシュ・ライン(ソース・コードではblockと呼ばれる)は、連想性とサイズが設定可能なセットに編成される。これらには以下のステータス・フラグがある:
- Valid : データを保持している。アドレス・タグは有効である。
- Read : このフラグがセットされていないと、読み取り要求は受け付けられない。例えば、キャッシュ・ラインは有効であり、書き込みアクセスを完了するために書き込みフラグを待っているときは読めない。
- Write : 書き込みを受け付けることができる。Writeフラグを持つキャッシュ・ラインは、他のキャッシュ・メモリがコピーを保持していないユニークな状態であることを示す。
- Dirty : 追い出されるとき、ライトバックが必要である。
リード・アクセスは、アドレス・タグが一致し、有効フラグとリード・フラグが設定されていれば、キャッシュ・ラインにヒットする。書き込みアクセスは、アドレス・タグが一致し、Valid、Read、Writeフラグが設定されていれば、キャッシュ・ラインにヒットする。
MSHRキューとライト・バッファ・キュー
MSHR (Miss Status and Handling Registers)キューは、下位メモリ・レベルへのリード・アクセスを必要とするCPUの未処理のメモリ要求のリストを保持する。それらは以下の通りである:
- Cached Read Miss
- Cached Write Miss
- Uncached Read
WriteBufferキューは、以下のメモリ要求を保持する:
- Uncached Write
- Evicted (&dirty)キャッシュ・ラインからのライトバック
各メモリ・リクエストは、対応するMSHRオブジェクト(上図ではREADまたはWRITE)に割り当てられ、これは、コマンドを完了するために読み書きしなければならないメモリの特定のブロック(キャッシュ・ライン)を表す。上図のように、同じキャッシュ・ラインに対するキャッシュ・リード/ライトは共通のMSHRオブジェクトを持ち、1回のメモリ・アクセスで完了する。
ブロックのサイズ(したがって下位メモリへのリード/ライト・アクセスのサイズ)は以下の通りである:
- Cached アクセス&ライトバックのキャッシュラインのサイズ;
- Uncached アクセスの場合はCPU命令で指定される。
一般に、データ・キャッシュ・モデルでは、以下の2つのメモリ・タイプを区別する:
- Normal Cached Memory : これは常にライトバック、リード、ライトアロケートとして扱われる。
- Normal uncached Memory, Device, Strongly Orderedは(Uncached memoryとして)同等に扱われる