いくつかの例に分けてCHIのトランザクションの例を見ていく。
まず、トランザクションには2種類ある。
- DMT : Direct Memory Transfer
- スレーブノードはリクエストノードに対して直接データを転送することを許す
- DCT : Direct Cache Transfer
- 他のRN-Fノードはリクエストノードに対して直接データを転送することを許す
- DWT : Direct Write-data Transfer
- RNノードがスレーブノードに直接データを転送することを許可する
DMTの場合の転送例を見てみる。
- REQチャネルに対して以下のSnoopable Readリクエストを送信する
- ReadClean
- ReadNotSharedDirty
- ReadShared
- ReadUnique
- ReadPreferUnique
- MakeReadUnique
- ICNはREQチャネルを通じてReadNoSnpリクエストをSNに対して送信する
- SNは読み込みデータと、該当する転送レスポンスレスポンスを、CompDataオペコードを使用してリクエスタにRDATチャネルを通じて返答する
- トランザクションリクエストにExpCompAckビットが設定されているため、RequestはAcknowledegementを返さなrければならならい。CompAckオペコードを使用してトランザクションが完了したことを通知しなければならない。
DMTでのトランザクションには以下の制限が存在する
- リクエスターはTxnIDを、すべてのTxnIDが返ってきた後にのみ再利用することができる
- HomeノードはDMTリクエストが、SN-Fに送信する際に以下のことが適用されていることを確認できるまで待たなければならない。
次に、DCTの場合の転送方法を見てみる。
- REQチャネルに対して以下のSnoopable Readリクエストを送信する
- ReadClean
- ReadNotSharedDirty
- ReadShared
- ReadUnique
- ReadPreferUnique
- MakeReadUnique
- ICNはSnp[*]FwdリクエストをSNPチャネルを通じてRN-Fノードに対して送信する
- RN-FはDATチャネルを通じて関連するトランザクションレスポンスをCompDataオペコードとともにRNに対して送信する。
- RN-FはSnpRespFwdedレスポンスをICNに対してSRSPチャネルを通じて送信し、読み込みデータがリクエスタに送信されたことを通知する。
- トランザクションリクエストExpCompAckビットが設定されているため、リクエスタはCompAckオペコードを用いてSRSPチャネル上でAcknowlegdementを送信する必要がある。
DMTでもDCTでもない場合の転送方法は以下の通りとなる。
- REQチャネルに対して以下のSnoopable Readリクエストを送信する
- ReadClean
- ReadNotSharedDirty
- ReadShared
- ReadUnique
- ReadPreferUnique
- MakeReadUnique
- Completerは読み込みデータと関連するトランザクションリクエストをCompDataオペコードとともにRDATチャネルを通じて転送する。
- Acknowlegdementを転送する。
ReadNoSnp
: 他のマスタにスヌープが必要ない場合に使用する。データはReadNoSnpを用いてスレーブノードから転送される。ReadOne
,ReadOnceCleanInvalid
,ReadOnceMakeInvalid
: 他のマスタによりスヌーピングが必要だが、リクエスタが自身のキャッシュラインに割り当てられていない場合に使用する。