インテルのみ表示可能 — GUID: sgm1506347263620
Ixiasoft
インテルのみ表示可能 — GUID: sgm1506347263620
Ixiasoft
1.3.13.1.2. メモリーの一貫性の説明
CCI-Pは、同じアドレスおよび異なるアドレスへのリクエストの順序を変更することができます。同じアドレスに対するリクエストのデータハザードを特定するロジックは実装していません。
同じVCへの2つの書き込み
メモリーでは、最初の書き込み応答が受信された後に2つ目の書き込みリクエストが生成されない限り、同じVCに対する2つの書き込みは、それらの実行順序とは異なる場合があります。これは一般的に、ライトアフターライト (WaW) ハザードとして知られています。
次の表は、最初の書き込みが受信された後に2番目の書き込みが実行される場合の、同じVCへの2つの書き込みを示しています。
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つの書き込みが、発行された順序とは異なる順序でメモリーに確定される場合があることを示しています。
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を使用し書き込み順序を強制する方法を示しています。
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 |
異なるVCからの2つの読み出し
異なるVCへ読み出しを発行すると、順不同で完了する場合があり、最後の読み出し応答が古いデータを返す場合があります。
次の表に、異なる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 |
同じVCからの2つの読み出し
プロセッサー | 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への書き込みを実行する必要があります。