6

Intel 64 and IA-32 Architectures Software Developer's Manual によると、LOCK シグナル プレフィックスは、「シグナルがアサートされている間、プロセッサが共有メモリを排他的に使用することを保証します」。これは、バス ロックまたはキャッシュ ロックの形式である場合があります。

しかし、それが私がこの質問をしている理由です-このプレフィックスがメモリバリアも提供するかどうかは私には明らかではありません.

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

では、MFENCE、SFENCE、および LFENCE 命令を使用する必要がありますか、それとも冗長でしょうか?

4

3 に答える 3

7

いいえ、プレフィックスMFENCE, SFENCE and LFENCEに関連する命令を使用する必要はありません。LOCK

MFENCE, SFENCE and LFENCE命令は、すべての CPU コアでメモリの可視性を保証します。インスタンスでは、MOV命令をプレフィックスで使用することはできないLOCKため、メモリ移動の結果がすべての CPU コアに確実に表示されるようにするには、CPU キャッシュが RAM にフラッシュされ、フェンス命令で到達する必要があります。

編集: Intel マニュアルのロックされたアトミック操作の詳細:

ロックされたアトミック操作

32 ビット IA-32 プロセッサは、システム メモリ内の位置に対するロックされたアトミック操作をサポートします。これらの操作は、通常、2 つ以上のプロセッサが同じフィールドまたはフラグを同時に変更しようとする共有データ構造 (セマフォ、セグメント記述子、システム セグメント、またはページ テーブルなど) を管理するために使用されます。プロセッサは、ロックされたアトミック操作を実行するために、相互に依存する 3 つのメカニズムを使用します。

• 保証されたアトミック操作

• LOCK# 信号と LOCK 命令プレフィックスを使用したバス ロック

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

これらのメカニズムは、次のように相互に依存しています。特定の基本的なメモリ トランザクション (システム メモリ内のバイトの読み取りまたは書き込みなど) は、常にアトミックに処理されることが保証されています。つまり、いったん開始すると、プロセッサは、別のプロセッサまたはバス エージェントがメモリ ロケーションへのアクセスを許可される前に操作が完了することを保証します。プロセッサは、選択されたメモリ操作 (メモリの共有領域での読み取り-変更-書き込み操作など) を実行するためのバス ロックもサポートします。これらの操作は通常、アトミックに処理する必要がありますが、この方法では自動的には処理されません。頻繁に使用されるメモリ位置はプロセッサの L1 または L2 キャッシュにキャッシュされることが多いため、バス ロックをアサートすることなくプロセッサのキャッシュ内でアトミック操作を実行できることがよくあります。

于 2011-01-27T10:08:35.983 に答える
5

いいえ。IA32 マニュアル (Volume 3A、Chapter 8.2: Memory Ordering ) から:

読み取りまたは書き込みは、I/O 命令、ロックされた命令、またはシリアル化命令で並べ替えることはできません。

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

于 2013-05-31T04:25:00.900 に答える