完了応答 (Completion Acknowledgement)
CHI は以下の以下のトランザクションの順序を維持するために完了確認応答を使用する:
- Fully Coherent Request Node (RN-F)が発行するトランザクション
- これらのRN-Fトランザクションによって引き起こされるスヌープトランザクション
完了確認は、RN-Fからのコヒーレント・トランザクションの後に発生する(順序付けられた)スヌープ・トランザクションが、そのコヒーレント・トランザクションが完了した後にのみ受信されることを保証する。
HN-Fはトランザクションをストールすることでトランザクションの順序を維持できる。
例えば、RN-Fは、特定のキャッシュ行に対して進行中の未処理のトランザクショ ンをすでに持っているかもしれない。
システム内の別のリクエスタが、その同じラインに対するスヌープをもたらすトランザクションを発行した場合、HN-Fはこの後のトランザクションをストールすることができる。
元のRN-Fがコヒーレント・トランザクションを完了すると、RN-FはTXRSPチャネルを使用して、完了確認(CompAck)メッセージをHN-Fに送信する。
その後、HN-Fは完了確認を待っていたスヌープのブロックを解除する。
このメカニズムはACEのRACK/WACKと同様の機能を持つ。
CHIのすべてのトランザクションが完了確認を必要とするわけではない。
完了確認が必要な場合、リクエストフ リットは ExpCompAck フィールドを含む。
完了確認が必要な場合、RN-Fはリクエストに ExpCompAck を1に設定し、リクエストが完了すると CompAck 応答を発行する。
手順は以下の通りである:
- Requester Node (RN-F)は
ExpCompAck = 1でリクエストを発行する。 - Home Node はリクエストを完了する。
- Home Node は
CompまたはCompDataをRN-Fに送る。 - RN-Fは
CompAckをHome Nodeに送信する。 - これでHome Node はRN-Fに待ち受けSnoopを送信できる。
以下の例は、Read RequestでCompletion Acknowledgementを要求したときに送信されるメッセージを示している:
1. Requester は、アドレス0x8000 の読み取り要求を ExpCompAck フィールドを1にセットして送信する:

2. Completerは、リードアドレスに任意のDBIDを割り当て、インターコネクトがそれに対する将来のコヒーレント・リクエストに対してスヌープを発行するのをブロックする。

3. Completer は、CompData レスポンスでRequesterに応答し、トランザクションの完了を示すと同時に読み取りデータを送信する。レスポンスのDBID フィールドには、読み取りアドレスを格納するために使用される場所のDBIDが入力される。

4. Requester は CompAck メッセージを送信する。CompAck は、図に示すように、Completer から受け取ったDBID値をトランザクションIDとして使用する:

5. Completer は、アドレス0x8000 のDBIDをクリアし、インターコネクトが将来このロケーションにスヌープを発行できるようにする。
スヌープを使用したCompAck
この例では、複数のRequester Nodeが同じキャッシュ可能なメモリアドレスにアクセスし、Completion Acknowledgeが必要な場合に送信されるメッセージを示す。 この例では、CHI インターコネクトはすべてのキャッシュ・リクエスタにスヌープをブロードキャストする。 (あるいは、スヌープ・フィルタを利用し、キャッシュラインが存在するRequesterのみをターゲットにすることも可能である)。
1. Requester Node 0は、アドレスAに対する MakeUnique メッセージをHome Node 3に発行する。このトランザクションは、Requester Node 0がCompletion Acknowledge をHome Node 3に発行することで完了する。

2. Home Node 3は、図に示すように、SnpMakeInvalid スヌープをRequester Node 1と2にアドレスAに対して発行する:

3. Requester Node 1と2は、SnpResp_I レスポンスで応答する。これらの応答は、アドレスAが無効化されたことを意味する。Home Node 3は、SnpResp_I を任意の順序で受信することができる。 この手順を図に示す:

4. Requester Node 2は、アドレスAに対する ReadShared リクエストを Home Node 3に送信する。 Home Node 3は、Requster Node 0からの MakeUnique メッセージにまだ応答していないことに注意すること。ReadShared リクエストから生成されるすべてのスヌープは、Requester Node 0が MakeUnique のCompletion Acknowledgeメッセージを送信するまでブロックされる。

5. Home Node 3は、ステップ3で受信したSnoopレスポンスのため、 Comp_UC メッセージでRequest Node 0に応答する。
6. Request Node 0は CompAck メッセージを送信し、アドレスAへのスヌープのブロックを解除する。
7. Home Node 3は、SnpShared スヌープ・リクエストを、アドレスAに対するRequester Node 0と1に生成する。
8. Requester Node 1は SnpResp で応答し、データを持っていないことを示す。
9. Requester Node 0は SnpRespData で応答し、アドレスAに対する最新のデータを送信する。
10. 両方のスヌープ応答を受信した後、Home Node 3は Requester Node 2に Snoopデータを返す。
11. Requester Node 2は CompAck を Home Node 3に送信する。Home Node 3はアドレスAに対して将来スヌープを生成することができる。