インターコネクト間のプロトコルフローについて
次に、CHIのプロトコルフローについて見ていく。
Read Transaction flows
Read transactions with DMT and without snoops
DMTというのはDirect Memory Transferであるということを思い出しておく。つまりリクエスタの要求に対して、データはHomeノードを介さず直接変換される。
- RN-FがHN-FにReadリクエストを送る
- HN-FがSN-FにReadリクエストを送る
- SN-FはデータレスポンスをRN-Fに直接返信する
- 最初のリクエストがReadSharedの場合、RN-FはHN-FにCompAckを送信する。
![f:id:msyksphinz:20210815231655p:plain:w400](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20210815/20210815231655.png)
この図を見てわかる通り、RN-Fのキャッシュラインの状態はI(Invalid)からUC(Unique Clean)状態になる。
Read transactions with DMT and with snoops
DMTにおけるスヌープ付きのリードリクエストについてフローを確認する。このためには、ReadShared
トランザクションを送出する。
下記のダイアグラムにおいて、ノードの役割は以下のとおりである。
- RN-F0 : リクエストノード。リクエストを送出する。
- RN-F1 : リクエストノード。今回はリクエストを送出せず、ホームノードからスヌープを受け取る。
- HN-F : ホームノード。スヌープ処理とスレーブへのリクエスト送出を取り扱う。
- SN-F : スレーブノード。データリクエストを受け取りレスポンスを返す。
いかのような順序でフローが実行される。
- RN-F0がHN-Fにリードリクエストを送出する。
- HN-FがスヌープリクエストをRN-F1に送出する。
- RN-F1からスヌープレスポンスを受け取り、RN-F1にデータが存在しないことを確認した後、HN-FがSN-Fに対してリードリクエストを送出する。
- SN-FはデータレスポンスをRN-F0に送出する。
- RN-F0はCompAckをHN-Fに送出し、ReadSharedのリクエストを完了させる。
![f:id:msyksphinz:20210817235553p:plain:w400](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20210817/20210817235553.png)
read transaction with DCT
DCTはダイレクトキャッシュ転送(Direct Cache Transfer)を用いるタイプの転送について。
ここでのポイントは、RN-F1のスヌープリクエストに対するレスポンスが、直接RN-F0に返されるということである。
- RN-F0はホームノードHN-FにReadSharedを送出する。
- HN-FはSnpSharedFwdを送出して、RN-F1に対してフォワーディングスヌープリクエストを転送する。
- RN-F1のキャッシュライン状態はUCからSCに更新される。
- RN-F1はCompData_SCをRN-F0に転送する。
- RN-F1はSnpResp_SC_Fwded_SC スヌープをリクエストをHN-Fに送出する。つまり、
- CompDataレスポンスをRN-F0が送信し、HN-Fは転送を完了する。
![f:id:msyksphinz:20210817235618p:plain:w400](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20210817/20210817235618.png)