2011-07-01 39 views
0

InterlockCompareExchange操作をC++の変数に使用するアルゴリズムを使用すると、特定のスレッドによってデータセットが書き込まれているかどうかが判断されます小さなロック)、どのようにデータがi7上のレベル2キャッシュに格納されている場合、値を更新したインターロックされた操作が他のスレッドによって直ちに見られるようにするか。スレッド同期のためのインターロックの使用とキャッシュコヒーレンシの維持

マルチコアプロセッサのキャッシュ間でデータを一貫性を保つためにキャッシュコヒーレンシーを使用していますが、1つのコアがインターロック機能を持つ変数を更新し、キャッシュがコヒーレンシの問題をチェックして修正する小さなフレームすべてのコアがそれ自身のキャッシュにある変数をチェックしていますか? InterlockCompareExchange操作を実行している変数がvolatileであることを確認して、変更がメモリに直接書き込まれるようにすると、この問題は解決されますか?メモリバリア(VSのMemoryBarrier())がキャッシュのコヒーレンシを保証するのではなく、望ましくない命令の並べ替えを確実にすると確信するのは正しいですか?

私の質問があまりにも曖昧でないことを願っています。私はもしあればどんなコメントにも答えようとします。特定の問題はありませんが、この問題を投稿するソースコードはありませんが、これに問題がある場合は、特にC++ 0xのインターロックを部分的に持つことができます。その標準ライブラリの。

ありがとうございます。

+0

"即時"はありません。書かれたものはすべて最終的に他のコアで見られます。何かが見られる絶対時間は心配するものではなく、他の書き込みに対する相対的な順序だけです。 – Ringding

答えて

1

コンパイラは、インターロックされた関数呼び出しでロードまたはストアの順序を変更することはできません。実装には、CPUコアが実行しないようにするために必要なマシン命令が含まれます。

キャッシュのコヒーレンシーは常に維持されますが、値が実際に命令パイプラインからキャッシュに書き出されるときに悩む必要があるのは、順序付けの問題です。

+0

したがって、1つのコア上の1つのスレッドが変数に対してインターロックされた操作を実行すると、キャッシュに書き込まれる新しい値とキャッシュ一貫性によって、その値を持つキャッシュラインが有効でなくなったクロックサイクル?また、キャッシュラインに他の値がある場合に備えて、キャッシュラインをフラッシュする必要がないように、揮発性を使用する方が速いでしょうか? – contrapsych

+0

@ JAKE:多くのアーキテクチャでは、すべての値が変更されていなくても、すべてのキャッシュ<->は一度に1行ずつメモリ転送が行われます –

関連する問題