37

Microsoft は、InterlockedCompareExchangeアトミック コンペア アンド スワップ操作を実行するための機能を提供しています。組み込みもあります。_InterlockedCompareExchange

x86 では、これらはlock cmpxchg命令を使用して実装されます。

ただし、これら 3 つのアプローチに関するドキュメントを読んでみると、整合要件については一致していないようです。

Intel のリファレンス マニュアルには、アラインメントについては何も記載されていません (アラインメント チェックが有効で、アラインされていないメモリ参照が行われた場合、例外が生成されること以外は)

接頭辞も調べましたがlock、具体的には次のように述べています

LOCK プレフィックスの整合性は、メモリ フィールドのアラインメントの影響を受けません。

(私のものを強調)

そのため、インテルはアライメントは無関係だと言っているようです。操作は何があってもアトミックになります。

_InterlockedCompareExchange組み込みのドキュメントにもアラインメントについては何も記載されていませんが、関数InterlockedCompareExchange は次のように記載されています

この関数のパラメーターは、32 ビット境界に揃える必要があります。そうしないと、関数はマルチプロセッサ x86 システムおよび非 x86 システムで予期しない動作をします。

それで、何が得られますか?命令が使用できないInterlockedCompareExchange486 より前の CPU でも関数が機能することを確認するためだけのアライメント要件はありますか? cmpxchg上記の情報に基づいている可能性が高いようですが、信頼する前に確認したいと思います。:)

それとも、原子性を保証するために ISA でアラインメントが必要なのですか? Intel のリファレンス マニュアルの間違った場所を探しているだけですか?

4

4 に答える 4

11

x86 では、命令をアトミックにするためにアライメントは必要ありません。lock cmpxchgただし、優れたパフォーマンスを得るにはアライメントが必要です。

これは当然のことです。下位互換性とは、14 年前のマニュアルで書かれたソフトウェアが現在のプロセッサでも実行できることを意味します。最新の CPU には、スプリット検出専用のパフォーマンス カウンターさえありますlock。これは非常に高価だからです。(コアは、操作中に単一のキャッシュ ラインへの排他的アクセスを保持することはできません。従来のバス ロックのようなことを行う必要があります)。

Microsoft が整合要件を正確に文書化している理由は明確ではありません。RISC アーキテクチャをサポートするためには確かに必要ですが、マルチプロセッサ x86 での予測不可能な動作に関する特定の主張は、有効ではないかもしれません。(正確性の問題ではなく、予測不可能なパフォーマンスを意味する場合を除きます。)

486 より前のシステムにのみ適用するというあなたの推測はlock cmpxchg正しいかもしれません。そこでは、純粋なロードまたは純粋なストアの周りにある種のロックが必要になる可能性のある別のメカニズムが必要になります。(また、486には、 586 Pentium で新しく追加された最新の( )cmpxchgとは異なり、現在文書化されていないオペコード( 0f a7)があることに注意してください。Windows はP5 Pentium 以降でのみ使用されていた可能性がありますが、私にはわかりません。)最近の x86 の奇妙さを暗示することなく、いくつかの x86。cmpxchg0f b1cmpxchg

インテル® 64 および IA-32 アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル
第 3 巻 (3A): システム・プログラミング・ガイド
2013 年 1 月

8.1.2.2 ソフトウェア制御のバスロック

LOCK セマンティクスを明示的に強制するために、ソフトウェアは、メモリ位置を変更するために使用される次の命令で LOCK プレフィックスを使用できます。[...]

• 交換命令 (XADD、CMPXCHG、および CMPXCHG8B)。
• XCHG 命令では、LOCK プレフィックスが自動的に想定されます。
• [...]

[...] バス ロックの完全性は、メモリ フィールドのアラインメントの影響を受けません。LOCK セマンティクスは、オペランド全体を更新するのに必要な数のバス サイクルで実行されます。ただし、システム パフォーマンスを向上させるために、ロックされたアクセスを自然な境界に揃えることをお勧めします。

• 8 ビット アクセスの境界 (ロックされているかどうかに関係なく)。
• ロックされたワード アクセスの 16 ビット境界。
• ロックされたダブルワード アクセスの 32 ビット境界。
• ロックされたクワッドワード アクセスの 64 ビット境界。


楽しい事実:接頭辞cmpxchg なしでもlockアトミック wrt です。コンテキスト スイッチであるため、シングルコア システムでのマルチスレッドに使用できます。

位置がずれていても、それはまだ原子的なものです。割り込み (完全に前または完全に後)、および他のデバイス (DMA など) によるメモリ読み取りのみがティアリングを確認できます。しかし、そのようなアクセスでは、ロードとストアの分離も見られる可能性があるため、古い Windows がシングルコア システムでより効率的な InterlockedCompareExchange のためにそれを使用したとしても、正確さのための調整は必要なく、パフォーマンスのみが必要です。これがハードウェア アクセスに使用できる場合、Windows はおそらくそれを行いません。

ライブラリ関数が とは別に純粋なロードを行う必要がある場合、lock cmpxchgこれは理にかなっているかもしれませんが、そうする必要はありません。(インライン化されていない場合、32 ビット バージョンはその引数をスタックからロードする必要がありますが、これはプライベートであり、共有変数へのアクセスではありません。)

于 2013-03-20T12:11:06.943 に答える
9

あなたが引用しているPDFは1999年のもので、明らかに時代遅れです。

最新の Intel ドキュメント、特にVolume-3Aは別の話をしています。

たとえば、Core-i7 プロセッサでは、データがキャッシュラインにまたがらないようにする必要があります。そうしないと、操作がアトミックであることが保証されません。

Volume 3A、System Programming、For x86/x64 Intel は次のように明確に述べています。

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

Intel486 プロセッサ (およびそれ以降の新しいプロセッサ) では、次の基本的なメモリ操作が常にアトミックに実行されることが保証されています。

  • バイトの読み取りまたは書き込み
  • 16 ビット境界に整列されたワードの読み取りまたは書き込み
  • 32 ビット境界に整列されたダブルワードの読み取りまたは書き込み

Pentium プロセッサ (およびそれ以降の新しいプロセッサ) では、次の追加のメモリ操作が常にアトミックに実行されることが保証されています。

  • 64 ビット境界に整列されたクワッドワードの読み取りまたは書き込み
  • 32 ビット データ バス内に収まるキャッシュされていないメモリ ロケーションへの 16 ビット アクセス

P6 ファミリ プロセッサ (およびそれ以降の新しいプロセッサ) では、次の追加のメモリ操作が常にアトミックに実行されることが保証されています。

  • キャッシュ ライン内に収まるキャッシュ メモリへのアライメントされていない 16、32、および 64 ビット アクセス

Intel Core 2 Duo、Intel® Atom™、Intel Core Duo、Pentium M、Pentium 4、Intel Xeon、P6 ファミリ、Pentium、およびIntel486 プロセッサ。Intel Core 2 Duo、Intel Atom、Intel Core Duo、Pentium M、Pentium 4、Intel Xeon、および P6 ファミリ プロセッサは、外部メモリ サブシステムが分割アクセスをアトミックにできるようにするバス制御信号を提供します。ただし、アライメントされていないデータ アクセスはプロセッサのパフォーマンスに深刻な影響を与えるため、避ける必要があります。

于 2011-03-03T09:37:45.250 に答える
4

この SO の質問を参照してください: 自然な配置はパフォーマンスにとって重要であり、x64 アーキテクチャで必要です (つまり、PRE-x86 システムだけでなく、POST-x86 システムでもあります。x64 はまだ少しニッチなケースかもしれませんが、成長しています。結局のところ、人気があります;-); それが、マイクロソフトが必要として文書化している理由かもしれません (MS がアライメント チェックを有効にしてアライメントの問題を強制することを決定したかどうかに関するドキュメントを見つけるのは難しいです。これは Windows のバージョンによって異なる場合があります。ドキュメントでアライメントが必要であると主張することにより、MS はWindows の一部のバージョンでは、他のバージョンでは強制していなくても、強制する自由があります)。

于 2009-09-12T15:15:30.423 に答える
3

Microsoft の Interlocked API も ia64 に適用されました (まだ存在していました)。ia64 にはロック プレフィックスはなく、cmpxchg.acq と cmpxchg.rel 命令 (または fetchadd と他の同様の獣) だけでした。私の記憶が正しければ、これらすべてにアライメントが必要でした。

于 2009-11-25T23:01:47.780 に答える