2

私は C でいくつかの低レベルの同期コードを書いています。そして、問題に遭遇しました:

2 つのスレッドがThread AありThread B、x86_64 マシンで実行されているとします。Thread A時刻t1にメモリ ロケーションに書き込み、その後、このロケーションへの書き込みはありません。時刻t2Thread Bで同じメモリ位置を読み取ります。

Thread A:
    foo = magic_value;  /* happens at t1 */

Thread B:
    bar = foo;  /* happens at t2 */
    assert(bar == magic_value);

私の質問は、t2 - t1 > deltaであるt1およびt2に対して、 deltaが存在するかどうかです。t1に書き込まれた最新の値を読み取ることが保証されています。Thread BThread A

Intel と AMD の文書を読んだことがありますが、そのような保証が存在するかどうかは言及されていませんでした。この値は、プロセッサのモデルまたはマザーボードの設計 (マルチソケット マシンの場合) に依存する可能性があることを知っています。現在利用可能な正常な x86_64 マシンでは、このレイテンシーに何らかの制限があるに違いないと思います。

ロックやメモリバリアなどの同期プリミティブを使用して、そのような動作を保証する方法を知っています。メモリアクセスがグローバルに見えるようになるために、そのような保証されたレイテンシが存在するかどうかを知る必要があるだけです.

どうもありがとう!!

4

2 に答える 2

1

はい、そのようなデルタが存在します。x86 メモリは一貫性がありますが、実際の最大デルタに保証はないと思います。論文Comparing Cache Architectures and Coherency Protocols on x86-64 Multicore SMP Systems に興味があるかもしれません (ただし、これはベンチマークであり、正式なドキュメントではありません)。

AFAIKfooを宣言volatileして、コンパイラに書き込み命令を最適化するのではなく、実際に追加させる必要があります。

于 2013-06-27T08:00:02.840 に答える
1

1 つの CPU がメモリ ロケーションに書き込みを行ってから、別の CPU がそれを参照するまでの最大時間については、保証がないと確信しています。NUMA システムでは、コヒーレンシ プロトコルに時間がかかります。実際には可能な限り高速になりますが、保証があるとは思えません。

なぜあなたはこれを知る必要があるのですか?同期プリミティブを作成するときは、順序付けについてのみ考える必要があります。x86_64 は強力な一貫性を強制します。つまり、ストアは発生した順序で他の CPU に表示され、実際に心配する必要があるのはそれだけです。

于 2013-06-27T08:14:20.003 に答える