6

x86 CPU0 と CPU1 でそれぞれ 2 つのスレッドが実行されているとします。CPU0 で実行されているスレッドは、次のコマンドを実行します。

A=1
B=1

最初に CPU1 が所有する A を含むキャッシュ ラインと、CPU0 が所有する B を含むキャッシュ ライン。

2 つの質問があります。

  1. 私の理解が正しければ、両方のストアが CPU のストア バッファに入れられます。ただし、最初のストアA=1では、CPU1 のキャッシュを無効にする必要がありますが、2 番目のストアB=1は、それを含むキャッシュ ラインを所有しているため、すぐにフラッシュできます。x86 CPU がストア オーダーを尊重することはわかっています。B=1それは前にキャッシュに書き込まれないということA=1ですか?

  2. CPU1 で次のコマンドが実行されるとします。

ながら (B=0);
プリントA

x86 で常に 1 を出力するには、CPU0 との間に sfence を追加せずに、CPU1 のwhileprintコマンドの間に lfence のみを追加するだけで十分ですか?A=1B=1

while (B=0);
lfence
print A
4

1 に答える 1

8

x86 では、単一のプロセッサによる書き込みは、すべてのプロセッサで同じ順序で観察されます。あなたの例でも、x86 の通常のプログラムでもフェンスを設定する必要はありません。あなたのプログラム:

while(B==0);  // wait for B == 1 to become globally observable
print A;      // now, A will always be 1 here

キャッシュで正確に何が起こるかは、モデル固有です。あらゆる種類のトリックと投機的な動作がキャッシュで発生する可能性がありますが、観察可能な動作は常にルールに従います。

Intel System Programming Guide Volume 3 セクション 8.2.2 を参照してください。メモリ順序の詳細については、 を参照してください。

于 2012-01-16T16:56:22.197 に答える