x86-64 CPU (Intel または AMD) では、4/8 バイトを 32/64 ビットでアラインされたアドレスに書き込む「movnti」命令はアトミックですか?
2 に答える
はい、x86 上の他のすべての自然に整列された 8/16/32/64b ストア (およびロード) と同様movnti
に、自然に整列されたアドレスでアトミックです。これは、メモリの種類 (ライトバック、書き込み結合、キャッシュ不可など) に関係なく適用されます。Intel の x86 マニュアルの保証の文言については、そのリンクを参照してください。
原子性はメモリの順序付けとは別のものであることに注意してください。通常の x86 ストアはリリースストア操作ですが、movnt ストアは「リラックス」しています。
興味深い事実: 32 ビット コードは、x87 ( fild
/ fistp
) または SSE/MMXmovq
を使用して、アトミックな 64 ビット ロード/ストアを実行できます。gcc のstd::atomic
実装は実際にこれを行います。アトミック性が保証されていないのは、8B より大きい SSE アクセス (たとえばmovaps
、 16B/32B/64B ベクトル ストア) だけです。movntps
(一部のハードウェアでは 16B 操作でさえアトミックですが、これを検出する標準的な方法はありません)。
明らかにそうではないようです:
WC プロトコルは弱い順序のメモリ整合性モデルを使用するため、複数のプロセッサが異なるメモリ タイプを使用してメモリ位置の読み取り/書き込みを行う可能性がある場合は、SFENCE などのフェンシング操作を MOVNTI 命令と組み合わせて使用する必要があります。