gem5のサイクル精度モデルについて理解したいので、O3CPUのドキュメントを読んでみることにする。
次に、メモリサブシステムについてドキュメントを読み進めていく。
メモリ・アクセス・オーダリング
各CPUの読み込み・書き込みリクエストには(スレーブポートに登場するん順番に)ユニークな順序番号が割り当てられる。MSHRオブジェクトには、最初に割り当てられた読み込み・書きこみ番号がコピーされる。
それぞれの2つのキューからのメモリの読み書きはインオーダ(割り当てられた順序番号に従って)実行される。どちらかのキューが空でない場合、WriteBufferがいっぱいでない限りMSHRの読み込みが実行される。しかし、同じ(オーバラップされた)キャッシュラインへの読み込み・書きこみは順序番号に従って行われる。
まとめると:
- Cache Memoryへのアクセスの順序は、同じキャッシュ行を対象としない限り保たれない。たとえば、#1、#5、#10 のアクセスは、同じティックで同時に完了する(順番は変わらない)。アクセス#5は#3より先に完了する。
- 全てのUncached memoryへの書き込みの順序は保持される。Write#6は常にWrite#13より先に完了する。
- すべてのUncached memory に対する読み込み順序は保たれる。Read#2は常にRead#8より先に完了する。
- リードとライトのアクセス領域が重ならない限り、uncached memoryアクセスの順序は必ずしも保たれない。したがって、Write#6は常にRead#8より先に完了する(両者は同じメモリ・ブロックを ターゲットにしている)。しかし、Write#13がRead#8より先に完了することもある。
コヒーレント・バス・オブジェクト
コヒーレント・バス・オブジェクトは、スヌープ・プロトコルの基本をサポートする。
スレーブ・ポート上の全てのリクエストは、適切なマスター・ポートにて転送される。cached memory領域のリクエストは(スヌープ・リクエストとして)他のスレーブ・ポートにも転送される。
マスター・ポートは適切なスレーブ・ポートにリプライをフォワードする。
マスター・ポートはスヌープ・リクエストを適切なスレーブ・ポートにフォワードする。
スヌープ・ポートのスヌープ・リプライはリクエストの送信元に対してフォワードされる(スヌープ・リクエストのソースはスレーブ・ポートでもマスター・ポートでも良いことに注意する)。
以下のイベントが発生した後は、configurableな時間だけバスのブロックを宣言することができる。
- スレーブ・ポートへのパケットの送信(あるいは送信の失敗)
- マスター・ポートへのリプライ・メッセージの送信
- 1つのスレーブ・ポートのスヌープ・レスポンスが他のスレーブ・ポートへ転送された
ブロック状態のバスは、以下の到着するメッセージをブロックする。
- スレーブ・ポートのリクエスト
- マスター・ポートのリプライ
- マスター・ポートのスヌープ・リプライ
シンプルなメモリオブジェクト
このオブジェクトは、スレーブポートのアクセスをブロックすることはない。
メモリの読み込み・書きこみは即時適用される(読み込み・書きこみはリクエストを受け付けた時点で適用される)。
リプライ・メッセージはconfigurableな時間の後に返される。
メッセージ・フロー
メモリ・アクセス・オーダリング
以下のダイアグラムは、読み込みアクセスがデータキャッシュラインでValidとRead flagsがヒットした際のものである。
読み込みアクセスのキャッシュ・ミスでは、以下のように動作する。
バス・オブジェクトはDCache2とメモリ・オブジェクトからレスポンスを受け取るわけではないということに注意する。同一のReadReqパッケージ(メッセージ)オブジェクトをメモリとデータキャッシュに送信する。データキャッシュが、スヌープ・リクエストの応答を介したいとき、MEM_INHIBITフラグを設定して、メモリオブジェクトが何もメッセージを処理しないことを通知する。
メモリ・アクセス・オーダリング
次の図は、ValidとWriteフラグを持つDCache1キャッシュラインにヒットする書き込みアクセスを示している:
次の図は、ValidでDCache1キャッシュラインにヒットするが、Writeフラグがない書き込みアクセスを示している。DCache1は書き込み許可を得るためにUpgradeReqを発行する。DCache2::snoopTimingはヒットしたキャッシュ・ラインを無効にする。UpgradeRespメッセージはデータを持たないことに注意。
次の図はDCacheの書き込みミスを示している。ReadExReqはDCache2のキャッシュ・ラインを無効にする。ReadExResp はメモリ・キャッシュ・ラインの内容を運ぶ。