インテル® アクセラレーション・スタック (インテル® Xeon® CPU&FPGA対応) コア・キャッシュ・インターフェイス (CCI-P) リファレンス・マニュアル

ID 683193
日付 11/04/2019
Public
ドキュメント目次

1.3.13.1.2. メモリーの一貫性の説明

CCI-Pは、同じアドレスおよび異なるアドレスへのリクエストの順序を変更することができます。同じアドレスに対するリクエストのデータハザードを特定するロジックは実装していません。

同じVCへの2つの書き込み

メモリーでは、最初の書き込み応答が受信された後に2つ目の書き込みリクエストが生成されない限り、同じVCに対する2つの書き込みは、それらの実行順序とは異なる場合があります。これは一般的に、ライトアフターライト (WaW) ハザードとして知られています。

次の表は、最初の書き込みが受信された後に2番目の書き込みが実行される場合の、同じVCへの2つの書き込みを示しています。

表 34.  同じVCへの2つの書き込み (1つのみ未処理)
AFU プロセッサー

VH1: Write1 Addr=X, Data=A

Resp 1

VH1: Write2 Addr=X, Data=B

Resp 2

Read1 Addr=X, Data = A

Read2 Addr=X, Data = B

AFUは同じVCでアドレスXへ2回書き込みますが、最初の書き込みが受信されてからのみ2番目の書き込みを送信します。これにより、最初の書き込みがリンクで送信された後に次の書き込みが送信されるようになります。CCI-Pは、プロセッサーがこれらの書き込みを発行された順序で認識するよう保証します。プロセッサーはアドレスXを複数回読み出す際に、データAを認識し、その後データBを認識します。

同じVCへの書き込み間に順序付けを強制するには、WrFenceを代わりに使用します。WrFenceのセマンティクスはより強力で、フェンス前の書き込みがすべて完了するまでフェンス後の書き込み処理すべてをストールすることに注意してください。

異なるVCへの2つの書き込み

次の表は、異なるVCへの2つの書き込みが、発行された順序とは異なる順序でメモリーに確定される場合があることを示しています。

表 35.  異なる順序での書き込みの確定
AFU プロセッサー

VH1: Write1 X, Data=A

VL0: Write2 X, Data=B

Read1 X, Data = B

Read2 X, Data = A

AFUはXに対して2回の書き込みを行います (VH1を介してData=A、VL0を介してData=B)。プロセッサーはアドレスXでポーリングし、Xへの更新を逆の順序で認識する場合があります (CPUはData=Bの後にData=Aを認識する)。すなわち、プロセッサーが認識する書き込み順序は、AFUが書き込みを完了した順序とは異なる場合があります。異なるチャネルへの書き込みには順序付けの規則がないため、書き込みフェンスをVAにブロードキャストし、それらを同期させる必要があります。

次の表は、WrFenceを使用し書き込み順序を強制する方法を示しています。

表 36.  書き込み順序強制のためのWrFenceの使用
AFU プロセッサー

VH1: Write1 Addr=X, Data=A

VA: WrFence

VL0: Write2 Addr=X, Data=B

Read1 Addr=X, Data = A

Read2 Addr=X, Data = B

この場合、AFUはVA WrFenceを2つの書き込み間に追加しています。WrFenceは、プロセッサーにWrFence前の書き込みを可視化した後に、WrFence後の書き込みを可視化します。よって、プロセッサーはData=Aを認識し、その後Data=Bを認識します。シリアル化される書き込みが異なるVCで送信されているため、WrFenceはVAに発行されます。

異なるVCからの2つの読み出し

異なるVCへ読み出しを発行すると、順不同で完了する場合があり、最後の読み出し応答が古いデータを返す場合があります。

次の表に、異なるVCを介した同じアドレスからの読み出しが順不同になる場合があることを示します。

表 37.  同じアドレスに対する読み出し順序の変動 (異なるVCを介して)
プロセッサー AFU

Store addr=X, Data=A

Store addr=X, Data=B

Request Response
VH1: Read1 Addr=X
VL0: Read2 Addr=X
VL0: Resp2 Addr=X, Data=B
VH1: Resp1 Addr=X, Data=A
プロセッサーはX=1を書き込み後にX=2を書き込みます。AFUは、異なるVCを介してXを2回読み出します。Read1はVH1で送信され、Read2はVL0で送信されます。FIUは応答の順序を変更し、データを異なる順序で返す場合があります。AFUはX=2を認識し、その後X=1を認識する場合があり、これはプロセッサーの書き込み順序とは異なります。

同じVCからの2つの読み出し

同じVCへの読み出しは、順序が変わって完了する場合がありますが、最後の読み出し応答はかならず最新のデータを返します。次の表で示すように、最後の読み出し応答は古い読み出しリクエストに対応する場合があります。
注: VA読み出しは、異なるVCからの2つの読み出しのように動作します。
次の表に、同じVCを介した同じアドレスからの読み出しの順序が入れ替わる場合があることを示しています。ただし、AFUは書き込まれた順序と同じ順序で更新を認識します。
表 38.  同じアドレスに対する読み出し順序の変動 (同じVCを介して)
プロセッサー AFU

Store Addr=X, Data=A

Store Addr=X, Data=B

Request Response
VL0: Read1 Addr=X
VL0: Read2 Addr=X
VL0: Resp2 Addr=X, Data=A
VL0: Resp1 Addr=X, Data=B

プロセッサーはX=1の後にX=2を書き込みます。AFUは同じVCを介してアドレスXを2回読み出します。Read1およびRead2はどちらもVL0に送信されます。FIUが読み出し応答順序を変更する場合がありますが、CCI-P標準は最新のデータを最後に返すことを保証しています。つまり、AFUはアドレスXへの更新を、プロセッサーが書き込んだ順序で認識します。

VAを使用する場合、FIUは順不同でデータを返す場合があります。これは、VAリクエストはVL0、VH0またはVH1に向けられる場合があるためです。

同じVCからのリードアフターライト

CCI-P標準は、同じアドレスへの読み出しおよび書き込みリクエストの場合でも、それらのリクエストの順序付けを行いません。AFUは明示的にこの依存関係を解決する必要があります。

異なるVCからのリードアフターライト

AFUは異なるVCが使用される場合において、リードアフターライトの依存関係を解決することはできません。

同じVCまたは異なるVCに対するライトアフターリード

CCI-Pは同じアドレスに対するリクエストの場合でも、読み出し後の書き込みの順序付けを行いません。AFUは明示的にこの依存関係を解決する必要があります。AFUは、読み出し応答が受信された後にのみ書き込みリクエストを送信する必要があります。

トランザクションの順序付けのシナリオ例

同じアドレスへのトランザクション—同じアドレスへの複数の未処理の読み出しまたは書き込みリクエストは、非決定的な動作になります。
  • 例1: 同じアドレスXへの2つの書き込みは、順不同で完了する場合があります。アドレスXの最終的な値は非決定的です。順序付けを強制するには、書き込みリクエストの間にWrFenceを追加します。または、同じ仮想チャネルにアクセスする場合は、最初の書き込みからの応答が返されるまで待機し、その後2番目の書き込みを発行します。
  • 例2: 同じアドレスXからの2つの読み出しは、順不同で完了する場合があります。これはデータハザードではありませんが、AFUデベロッパーは順序付けに関する前提を立てないでください。読み出しがどちらも同じ仮想チャネルに発行されている場合、受信する2番目の読み出し応答はアドレスXに保存されている最新のデータを含みます。
  • 例3: アドレスXに対する書き込み後のアドレスXからの読み出しは非決定的です。すなわち、読み出しはアドレスXの新しいデータ (書き込み後のデータ) または古いデータ (書き込み前のデータ) を返します。確実に最新データの読み出しを行うには、同じ仮想チャネルを使用し、アドレスXへの読み出しを発行する前に書き込み応答が返されるのを待機します。
  • 例4: アドレスXに対する読み出し後の書き込みは非決定的です。すなわち、読み出しはアドレスXの新しいデータ (書き込み後のデータ) または古いデータ (書き込み前のデータ) を返します。

    読み出し応答を使用し、読み出しの依存関係を解決します。

異なるアドレスへのトランザクション—異なるアドレスへの読み出しまたは書き込みリクエストは、順不同で完了する場合があります。
  • 例1: AFUがアドレスZへデータを書き込み、その後アドレスXのフラグの値を更新することでSWスレッドに通知を行うとします。

    これを実装するには、AFUはZへの書き込みとXへの書き込みの間に書き込みフェンスを使用する必要があります。書き込みフェンスは、Xへの書き込みが処理される前にZをグローバルに可視化します。

  • 例2: AFUがアドレスZから始まるデータを読み出し、その後アドレスXのフラグの値を更新することでソフトウェア・スレッドに通知を行うとします。

    これを実装するには、AFUはZからの読み出しを実行し、読み出し応答をすべて待機した後にXへの書き込みを実行する必要があります。