以下の内容はhttps://msyksphinz.hatenablog.com/entry/2025/01/10/040000より取得しました。


キャッシュコヒーレンスを管理するバスプロトコルの勉強 (4. それぞれのプロトコルでのキャッシュコヒーレンシのとり方3)

例えば、4CPU + L2キャッシュが存在している状態をまずは考えよう。前回の記事の状態から、CPU2が書き込みを発生させるとどうなるか。

※以下の説明はChatGPTにかなり頼っているところがある。間違っているところもあるかもしれない...

ACEプロトコル

ACE にはいくつかのやり方があるが、一般的なライトアロケート(Write-allocate) ポリシーのシナリオを考える。

CPU2 がストアを実行すると、内部的には ReadForOwnershipReadUnique 相当のリード要求をまず発行して、ラインを“自コア排他”の状態で取得してから書き込みを行う。

あるいは、AWチャネルWriteUnique を直接発行する形もある。

  1. CPU2 は ACEのマスタIFから以下のような要求を出す
    • 例: ARチャネルで ReadUnique(自分が排他権を取りたい)
    • または AW Channel.awunique=1 で WriteUnique を開始する実装もあり。
  2. L2(インターコネクト) は、「現在 CPU0, CPU1 が Shared で持っている」ことをタグやディレクトリから把握
    • そこで、AC Channelを使い、CPU0 と CPU1 に対して Invalidate (または CleanInvalid) などのスヌープ要求を送る
    • CPU0, CPU1 は “Shared” で保持していただけ(Dirtyではない)ため、「キャッシュラインを無効化しました」という応答(CR Channel)を返すだけでデータ書き戻しは不要
  3. CPU2Exclusive / Modified 状態を獲得
    • L2 は書き込みデータを CPU2 に渡す、もしくは CPU2 が自分のキャッシュにラインを取り込んで書き込み
    • このとき L2 も内部的に “Owned/Dirty” としてマークするか、あるいは「CPU2 が Modified で保持している」記録を保持
  4. CPU0, CPU1 は 該当ラインを Invalid に遷移

CHIプロトコル

CHIでは、CPU2 (Requester) が「Write」を行いたい場合、通常はExclusive or Owned状態を取得するためのリクエストを REQチャネル で発行する。

代表的には “ReadForOwnership”“WriteNoSnoop”(ただし後者は本来Non-coherentアクセスの場合)など、「排他権を得たい」という意図を示すコマンドが送られます。

  1. CPU2L2: REQチャネルで “ReadForOwnership” (または類似コマンド) を発行する
  2. L2 (Home Node) は自分のディレクトリを確認し、「CPU0, CPU1 が Shared 保持中」と判定
    • SNP Channelを使い、CPU0, CPU1 に “Invalidate” や “MakeInvalid” 等のスヌープ要求を送る
    • CPU0, CPU1 とも “Shared (Clean)” なので書き戻し不要の応答を返しつつ、Invalid に遷移
  3. スヌープ完了後、L2 は CPU2 に対し、DAT Channelでラインを渡し、RSP Channel で「Exclusive/Modified権限を与えた」という応答を返す
  4. CPU2 は最終的にそのラインを Modified (または Exclusive) 状態で取得し、書き込みが可能となる

TileLink では、書き込み(ストア)を行う前に “Acquire” で Exclusive/Dirty の権限を取得する必要がある。

これにより、他のクライアントが Shared で持っているラインを無効化させます。

  1. CPU2L2: Aチャネルで “Acquire (Grow)” を送信
    • Grow”パラメータとして「ブロックを Exclusive あるいは Dirty にしたい」(TileLink用語では “to Trunk/Tip” のような指定)
  2. L2(Manager) は「他コアが Shared を保持している(CPU0, CPU1)」のを把握
    • B Channel(Probe) を CPU0, CPU1 に送って「そのラインをダウングレード/無効化しろ」と要求
    • CPU0, CPU1 は C Channel(Release) で「Cleanとなった」と応答しつつキャッシュラインを Invalid に遷移
    • L2 は書き戻し不要(クリーン)だと判断
  3. プローブ完了後、L2D Channel(Grant) で CPU2 に「Exclusive/Dirty権限付与」を通知し、必要なデータを転送
  4. CPU2 は Eチャネル(Finish) で完了を応答し、キャッシュラインを トランク(Trunk)/チップ(Tip) と呼ばれる「排他・書き込み可能」状態にセットし、ストア命令を実行できる。



以上の内容はhttps://msyksphinz.hatenablog.com/entry/2025/01/10/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14