例えば、4CPU + L2キャッシュが存在している状態をまずは考えよう。前回の記事の状態から、CPU2が書き込みを発生させるとどうなるか。
※以下の説明はChatGPTにかなり頼っているところがある。間違っているところもあるかもしれない...

ACEプロトコル
ACE にはいくつかのやり方があるが、一般的なライトアロケート(Write-allocate) ポリシーのシナリオを考える。
CPU2 がストアを実行すると、内部的には ReadForOwnership や ReadUnique 相当のリード要求をまず発行して、ラインを“自コア排他”の状態で取得してから書き込みを行う。
あるいは、AWチャネルで WriteUnique を直接発行する形もある。
- CPU2 は ACEのマスタIFから以下のような要求を出す
- 例: ARチャネルで
ReadUnique(自分が排他権を取りたい) - または AW Channel.
awunique=1 で WriteUnique を開始する実装もあり。
- 例: ARチャネルで
- L2(インターコネクト) は、「現在 CPU0, CPU1 が Shared で持っている」ことをタグやディレクトリから把握
- そこで、AC Channelを使い、CPU0 と CPU1 に対して Invalidate (または CleanInvalid) などのスヌープ要求を送る
- CPU0, CPU1 は “Shared” で保持していただけ(Dirtyではない)ため、「キャッシュラインを無効化しました」という応答(CR Channel)を返すだけでデータ書き戻しは不要
- CPU2 が Exclusive / Modified 状態を獲得
- L2 は書き込みデータを CPU2 に渡す、もしくは CPU2 が自分のキャッシュにラインを取り込んで書き込み
- このとき L2 も内部的に “Owned/Dirty” としてマークするか、あるいは「CPU2 が Modified で保持している」記録を保持
- CPU0, CPU1 は 該当ラインを
Invalidに遷移
CHIプロトコル
CHIでは、CPU2 (Requester) が「Write」を行いたい場合、通常はExclusive or Owned状態を取得するためのリクエストを REQチャネル で発行する。
代表的には “ReadForOwnership” や “WriteNoSnoop”(ただし後者は本来Non-coherentアクセスの場合)など、「排他権を得たい」という意図を示すコマンドが送られます。
- CPU2 → L2: REQチャネルで “ReadForOwnership” (または類似コマンド) を発行する
- L2 (Home Node) は自分のディレクトリを確認し、「CPU0, CPU1 が Shared 保持中」と判定
- SNP Channelを使い、CPU0, CPU1 に “Invalidate” や “MakeInvalid” 等のスヌープ要求を送る
- CPU0, CPU1 とも “Shared (Clean)” なので書き戻し不要の応答を返しつつ、
Invalidに遷移
- スヌープ完了後、L2 は CPU2 に対し、DAT Channelでラインを渡し、RSP Channel で「Exclusive/Modified権限を与えた」という応答を返す
- CPU2 は最終的にそのラインを Modified (または Exclusive) 状態で取得し、書き込みが可能となる
TileLink
TileLink では、書き込み(ストア)を行う前に “Acquire” で Exclusive/Dirty の権限を取得する必要がある。
これにより、他のクライアントが Shared で持っているラインを無効化させます。
- CPU2 → L2: Aチャネルで “Acquire (Grow)” を送信
- “Grow”パラメータとして「ブロックを
ExclusiveあるいはDirtyにしたい」(TileLink用語では “to Trunk/Tip” のような指定)
- “Grow”パラメータとして「ブロックを
- L2(Manager) は「他コアが Shared を保持している(CPU0, CPU1)」のを把握
- B Channel(Probe) を CPU0, CPU1 に送って「そのラインをダウングレード/無効化しろ」と要求
- CPU0, CPU1 は C Channel(Release) で「Cleanとなった」と応答しつつキャッシュラインを
Invalidに遷移 - L2 は書き戻し不要(クリーン)だと判断
- プローブ完了後、L2 は D Channel(Grant) で CPU2 に「Exclusive/Dirty権限付与」を通知し、必要なデータを転送
- CPU2 は Eチャネル(Finish) で完了を応答し、キャッシュラインを トランク(Trunk)/チップ(Tip) と呼ばれる「排他・書き込み可能」状態にセットし、ストア命令を実行できる。