4

x86 でのシーケンシャル コンシステント ロード操作に興味があります。

コンパイラーによって生成されたアセンブラーのリストを見る限り、x86 では単純なロードとして実装されていますが、私が知る限り、プレーンなロードはセマンティクスを取得することが保証されていますが、プレーンなストアは解放されることが保証されています。

シーケンシャル コンシステント ストアはロックされた xchg として実装され、ロードはプレーン ロードとして実装されます。私には奇妙に聞こえますが、これを詳しく説明していただけますか?

追加した

ロックされた xchg でストアが行われている限り、順次一貫性のあるアトミック ロードを単純な mov として実行できることがインターネットで見つかりましたが、証拠もドキュメントへのリンクもありませんでした。

4

3 に答える 3

10

SC ストアがed 命令で行われ、値が正しく配置され、「通常の」WB キャッシュ モードが使用さMOVれている限り、x86のプレーンはアトミックな順次一貫性のあるロードに十分です。LOCK

完全なマッピングについては、http://www.justsoftwaresolutions.co.uk/threading/intel-memory-ordering-and-c++-memory-model.html にある私のブログ投稿と、 http://developerにある Intel プロセッサのドキュメントを参照してください。許可されている注文の詳細については、 .intel.com/products/processor/manuals/index.htmを参照してください。

「WC」キャッシュモードまたは「非一時的」命令などを使用する場合MOVNTI、プロセッサは必ずしもデータをタイムリーにメインメモリに書き戻すとは限らないため、すべての賭けは無効になります。

于 2011-06-27T16:04:33.640 に答える
2

x86 での読み取りは本質的にアトミックであり、整列されている限りMOV、Intel アセンブリ マニュアル vol 2A の指示の下のセクションで、LOCKプレフィックスと同じようにこれについて言及する必要があります。他の巻にもこれが言及されているかもしれません

ただし、 が必要な場合はakaatomic readを使用できます。これにより古い値が生成されますが、その値は変更されません。同じことがakaで実行できますが、IMO、これは必要ありません_InterlockedExchangeAdd((LONG*)&var,0)LOCK XADDInterlockCompareExchange((LONG*)&var,var,var)LOCK CMPXCHG

于 2011-02-17T07:30:06.400 に答える
1

レジスタからメモリへの転送とその逆は、マルチプロセッサ環境では必ずしもアトミックではありません。

読む

XOR EAX, EAX
LOCK XADD [address], EAX

この最初の命令は EAX レジスタをゼロにし、2 番目の命令は両方の EAX の内容を [アドレス] と交換し、両方の合計を [アドレス] に再度格納します。以前は EAX レジスタがゼロだったので、何も変更されません。

書き込み

XCHG [address], EAX

EAX レジスタは、指定されたアドレスに格納する値を取得します。

EDIT : LOCK ADD EAX, [address] は、デスティネーション オペランドがメモリ アドレスではないため、「無効なオペコード例外」を引き起こします。

LOCK プレフィックスが他の命令で使用された場合、またはメモリへの書き込み操作が行われなかった場合、無効なオペコード例外 (#UD) が生成されます。8.1.2.2 ソフトウェア制御のバスロック

編集 2 : コメントからの情報を要約します。

その間

「[...] プロセッサのロック プロトコルは、LOCK プレフィックスまたは IOPL の値の有無に関係なく、交換操作中に自動的に実装されます。」

これには制限があります

「バス幅、キャッシュライン、およびページ境界に分割されたキャッシュ可能なメモリへのアクセスは、アトミックであることが保証されていません」

于 2011-02-16T14:53:26.920 に答える