11

最新の CPU が順不同で実行できることは知っていますが、ウィキペディアで説明されているように、常に結果を順番どおりに破棄します。

「順不同のプロセッサは、これらの「スロット」を、準備ができている他の命令で時間内に埋め、最後に結果を並べ替えて、命令が通常どおりに処理されたように見せます。

現在、マルチコア プラットフォームを使用する場合はメモリ フェンスが必要であると言われています。これは、アウト オブ オーダーの実行により、xの間違った値がここに出力される可能性があるためです。

Processor #1:
 while f == 0
  ;
 print x; // x might not be 42 here

Processor #2:
 x = 42;
 // Memory fence required here
 f = 1

ここで私の質問は、アウト オブ オーダー プロセッサ (私が想定するマルチコア プロセッサの場合はコア) は常に結果をイン オーダーで破棄するため、メモリ フェンスの必要性は何かということです。マルチコア プロセッサのコアは、他のコアからのリタイアした結果のみを認識しますか?それとも処理中の結果も認識しますか?

上記の例では、プロセッサ 2 が最終的に結果を破棄するとき、xの結果はfの前に来るはずですよね? 順不同の実行中に、 x の前に f を変更した可能性がありますが、 x の前にそれを廃止してはならないことはわかっますね?

結果のインオーダー リタイアとキャッシュ コヒーレンス メカニズムが整った今、なぜ x86 でメモリ フェンスが必要になるのでしょうか?

4

3 に答える 3

15

このチュートリアルでは、問題について説明しています: http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-7.pdf

最新の x86 プロセッサでメモリの順序付けの問題が発生する FWIW の理由は、x86 メモリの一貫性モデルは非常に強力な一貫性を提供しますが、書き込み後の読み取りの一貫性を処理するには明示的なバリアが必要だからです。これは、「ストア バッファ」と呼ばれるものによるものです。

つまり、x86 は、ロードが以前のストアに対して並べ替えられる可能性があることを除いて、順次一貫性があります (適切で、簡単に推論できます)。つまり、プロセッサがシーケンスを実行する場合

store x
load y

プロセッサ バスでは、これは次のように表示されます。

load y
store x

この動作の理由は、前述のストア バッファーにあります。これは、書き込みがシステム バスに出力される前の小さなバッファーです。ロード レイテンシは OTOH であり、パフォーマンスにとって重要な問題であるため、ロードは「キューをジャンプ」することが許可されています。

http://download.intel.com/design/processor/manuals/253668.pdfのセクション 8.2 を参照してください。

于 2011-09-08T11:00:42.943 に答える
8

メモリ フェンスは、フェンスの前の変数へのすべての変更が他のすべてのコアに表示されることを保証するため、すべてのコアが最新のデータ ビューを持っています。

メモリ フェンスを配置しない場合、コアが間違ったデータで動作している可能性があります。これは、複数のコアが同じデータセットで動作しているシナリオで特に見られます。この場合、CPU 0 が何らかのアクションを実行したときに、データセットに加えられたすべての変更が他のすべてのコアに表示されるようになり、最新の情報で作業できるようになります。

ユビキタスな x86/x64 を含む一部のアーキテクチャは、「フル フェンス」と呼ばれることもある命令を含むいくつかのメモリ バリア命令を提供します。完全なフェンスにより、フェンスの前のすべてのロードおよびストア操作が、フェンスの後に発行されるロードおよびストアの前にコミットされることが保証されます。

コアがデータセットの古いデータで作業を開始した場合、どのようにして正しい結果を得ることができるでしょうか? すべてが正しい順序で行われたかのように、最終結果が提示されるかどうかは問題ではありません。

キーは、キャッシュと CPU の間にあるストア バッファーにあり、次のように動作します。

リモート CPU から見えないストア バッファ

ストア バッファにより、メモリやキャッシュへの書き込みを保存して相互接続アクセスを最適化できます

つまり、このバッファーに何かが書き込まれ、ある時点でバッファーがキャッシュに書き込まれます。そのため、キャッシュには最新ではないデータのビューが含まれている可能性があり、そのため、キャッシュの一貫性により、別の CPU も最新のデータを持っていません。最新のデータを表示するには、ストア バッファのフラッシュが必要です。これは、基本的にメモリ フェンスがハードウェア レベルで発生させる原因だと思います。

編集:

例として使用したコードについて、ウィキペディアは次のように述べています。

プロセッサ #2 が f に割り当てられる前にメモリ バリアを挿入して、f の値の変更時または変更前に x の新しい値が他のプロセッサから見えるようにすることができます。

于 2011-09-08T11:01:25.423 に答える