2011-01-27 19 views
5

インテル64およびIA-32アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアルによると、LOCKシグナル・プレフィックスは、シグナルがアサートされている間、プロセッサーが共有メモリーを排他的に使用することを保証します。これは、バスまたはキャッシュロックの形で行うことができます。インテル64およびIA-32 |獲得/解放の意味を含むアトミック操作

しかし、これが私がこの質問をしている理由です。この接頭辞がメモリバリアを提供するかどうかは私には分かりません。

私はマルチプロセッサ環境でNASMを開発しており、オプションの取得および/または解放のセマンティクスでアトミック操作を実装する必要があります。

MFENCE、SFENCE、LFENCEの命令を使用する必要がありますか、それとも重複していますか?

答えて

6

いいえ、LOCK接頭辞との関連で、MFENCE, SFENCE and LFENCEという指示を使用する必要はありません。

MFENCE, SFENCE and LFENCE命令は、すべてのCPUコアでメモリの可視性を保証します。例えば、接頭辞ではMOV命令を使用することはできません。したがって、メモリ移動の結果がすべてのCPUコアで認識できるように、CPUキャッシュがRAMにフラッシュされ、フェンス命令で到達する必要があります。

EDIT:

LOCKEDアトミック操作

32ビット IA-32プロセッサは、システム内の位置で原子 操作をロックサポート メモリ:インテルマニュアルからロックアトミック操作に関する以上。これらの操作は、典型的には が共有データ構造を管理するために使用される2つの以上 プロセッサが同時に しようと同じフィールドまたはフラグを修正する可能性のある(例えば、セマフォ、セグメント 記述子、システム・セグメント、またはページ テーブルなど) 。

•保証アトミック操作

LOCK#信号を使用•バスロック、及びロック命令プリフィックス

•キャッシュコヒーレンシプロトコル: プロセッサは アトミック操作をロック行うための3つの相互に依存 メカニズムを使用しますキャッシュされたデータ構造上でアトミック操作を実行できることを保証します(キャッシュロック)。このメカニズムは、Pentium 4、Intel Xeon、およびP6ファミリプロセッサに存在します。

これらのメカニズムは、次の点で相互依存しています。特定の基本 メモリトランザクション( を読み取るか、システムメモリにバイトを書き込むなど) は、常にアトミックに として処理されることが保証されています。すなわち、一度起動されると、 プロセッサは、 の前に、 の操作が完了することを保証します。別のプロセッサまたはバスエージェントは、 がメモリロケーションへのアクセスを許可されています。 プロセッサはまた、典型的 がアトミック処理する必要があるが、 は自動的にこのように処理されない(そのようなメモリの 共有領域における リードモディファイライト動作のような)選択されたメモリ 動作を実行するためのバス ロックをサポート。頻繁に使用されるメモリ 場所がしばしば プロセッサのL1またはL2キャッシュにキャッシュされるため 、アトミック 操作はしばしば バスロックをアサートすることなく、プロセッサのキャッシュ内の を行うことができます。ここで プロセッサのキャッシュ・コヒーレンシ・プロトコル はアトミック 操作がキャッシュされ メモリ位置で実行されている間 が同じメモリ位置をキャッシュしている他のプロセッサが正しく 管理されていることを保証します。

+0

はい、わかります。しかし、私は(例えば)インターロックされたインクリメントを使用して、私がリソースを獲得していることを知らせたい。したがって、私はインクフェンスの前に 'lence'を使用する必要があることを意味します。どうして?なぜなら、私がシグナリングする前にすべての以前のロード操作が完了していることを確認する必要があるからです。 – 0xbadf00d

+0

いいえ、それを行う必要はありません、それは原子的に行う必要があります。ロックされたアトミック操作に関する私の編集をチェックしてください。 –

+0

しかし、アトミック操作はprioerとは何も関係なく、メモリの読み書きに従っていますか?このブログをチェック:http://blogs.msdn.com/b/kangsu/archive/2007/07/16/volatile-acquire-release-memory-fences-and-vc2005.aspx – 0xbadf00d

3

IA32マニュアルから第(ボリューム3A、章8.2:を注文メモリ):

I/O命令で並べ替えることができない読み込みや書き込み、は 指示をロック、またはシリアライズ命令。

したがって、ロックされた命令でフェンス命令は必要ありません。

関連する問題