私はx86のINC命令がアトミックではないことを読みました。私の質問はどのように来るのですか? INC命令はメモリ変数とレジスタの両方で動作するため、x86-64上で64ビット整数をインクリメントしているとします.1つの命令で実行できます。だから、それはどのように原子ではないのだろうかx86のINC命令はどのようにアトミックではありませんか?
答えて
なぜでしょうか?プロセッサー・コアは、依然としてメモリー位置に格納された値を読み取り、その増分を計算してから戻す必要があります。読み込みと保存の間には待ち時間があり、その間に別の操作がそのメモリの場所に影響を与える可能性があります。
アウトオブオーダーで実行されても、プロセッサコアは自分の命令を超えないように十分にスマートであり、時間差でこのメモリを変更する責任を負いません。ただし、別のコアがその場所を変更する命令を発行した可能性があります.DMA転送がその場所に影響を与えたか、または他のハードウェアがそのメモリ場所に何らかの形で触れた可能性があります。
「別の操作」が何を意味するのか、もう少し明確にする必要があります。確かに、他のコア/ CPUや他のハードウェアがメモリバスを迂回するだけで、同じCPUコアで他の動作は起こり得ません。 –
投稿を更新しました。 – Kaganar
あなたはあなたがそれを必要としない限り、本当にがAgner FogのSoftware optimization resourcesから、保証アトミック操作をしたくない:instruction_tables.pdf(1996年から2017年):LOCKプリフィックスと
命令は、その長い待ち時間を持っていますキャッシュ構成とおそらくRAMの速度に依存します。複数のプロセッサまたはコアまたはダイレクトメモリアクセス(DMA)デバイス がある場合、すべてのロックされた命令は排他アクセスのためにキャッシュラインをロックします。これにはRAMアクセスが含まれます。 LOCKプレフィックスは通常、シングルプロセッサの システムでも100クロックサイクル以上のコストがかかります。これは、メモリオペランドを持つXCHG命令にも適用されます。
この情報は確かに時代遅れです。ミューテックス全体のロック/アンロックサイクルは、テストした1台のマシンで90サイクル以下で、複数のロックプレフィックス演算とrdtscオーバーヘッドが必要です。 rdtscの間で単一のロックinc命令でテストすると、いつでも(nopと同じ時間で)測定することさえできませんでした。最近のcpusでは、メモリが他のコアと共有されていない限り、ロックの接頭辞は時間を増やさないようです。 –
@R .. - x86-64は2003年から提供されているので、おそらく包括的な記述です。私はそれが保留中の割り込み/ ctxスイッチにどのように影響するのだろうかと思います。 –
@ R ..まあ、90未満で100以上はそれほど離れていません:-) – hirschhornsalz
実行パイプラインの一部としての現代のx86プロセッサは、x86命令を低レベルの一連の操作に「コンパイル」します。 IntelはこれらのuOps、AMD rOpsと呼んでいますが、特定のタイプのx86命令は、CPU内の実際の機能ユニットによって実行されます。複数のステップ。
意味は、例えば、その:
INC EAX
は( - 彼らが露出していない私がいること、それを呼びましょう)uOp.inc eax
などのシングル「ミニOP」として実行されます。低レベルの分解はしかし、よりようになります
INC DWORD PTR [ EAX ]
:
uOp.load tmp_reg, [ EAX ]
uOp.inc tmp_reg
uOp.store [ EAX ], tmp_reg
ため、アトミックに実行されていない他のオペランドの事のため
は次のように、異なって見えます。一方でという接頭辞がLOCK INC [ EAX ]
と書かれている場合は、パイプラインの「コンパイル」ステージに、別の方法で分解してアトミック性要件が満たされていることを伝えます。
この理由は他の人によっても言及されているようです - スピード;何かを原子力にして、必ずしも必要ではないとしても必ず遅くするのですか?
"ミニオペレーション"分解は、単一のCPUコアが途中で中断できないため、アトミック性とは無関係です。実際、ロックプレフィックスのないincは、シングルコアマシンでは完全に原子的です。これは、他のコア(またはあいまいなことに、バス上の他のハードウェア)がロック接頭辞が関係するメモリにアクセスできるときだけです。 –
@R ..:そういう意味で、シングルコアの_any_ modify-mem cpu opは、どのようにしてもアトミックでした。しかし、バスマスタリングのDMA /メモリバスはペリフェラルと共有されているため、キャッシュの一貫性とアトミック性の問題が存在するため、シングルコアのマシンでさえも「シングル」ではありません。常に複数のメモリバスクライアントがあります。したがって、ロード/ストアは、メモリバスレベルでは、たとえ "シングル" CPU命令の一部として実行されたとしても常に_分解されます。アトミック性はアサートされなければならない(排他的メモリバスアクセス)。 CPUはload/change/storeとしてmodify-memを実行することはできませんが、バスのロック/アンロックでブラケットする必要があります。 –
@R ..:ARM CPUは、例えば、LDREX/STREXを介して、命令セットレベルのアトミシティのバスロックの必要性を明示的に示します。 x86がmem-modify命令を持っているという事実から、explicitnessの必要性はないと結論づけることはできません。また、問題は、中間命令を中断することではなく、原子性と同じではありません。 _single_命令のメモリアクセスは他のCPUのメモリアクセスと_race _することができるので、分解はその意味で強く重要です。命令が完了すると(再始動を必要とするトラップはない)、結果は(「ロック」なしで)一意/確定的ではない。 –
- 1. x86 ROR命令はどのように機能しますか?
- 2. はどのようにCAS命令を保証しアトミック
- 3. なぜINCおよびDEC命令はキャリーフラグに影響しませんか?
- 4. 動的に$ INC命令
- 5. x86チップでは、0x80以外のINT命令はありますか?
- 6. 今日、x86にはいくつの命令がありますか?
- 7. "out"と "in"命令の特権命令はありますか?
- 8. gccコンパイルdpdkエラー:そのような命令はありませんvextracti128
- 9. MOVDQAとMOVAPS x86命令の違いは?
- 10. 私はこのx86 Add命令が何をしているのか正確にはわかりません
- 11. MIPSに即時ロード命令と同じようにストアイミディエイト命令がありません
- 12. SSE命令はどのように使用できますか?
- 13. NEG命令はx86ではどのように調整フラグ(AF)を設定しますか?
- 14. X86 'cmpps'命令とLLVM IR 'fcmp'命令は入れ替え可能ですか?
- 15. アトミック命令によるマップアクセスの安全性を保証するには、2つの異なるアトミックで命令の並べ替えが可能ですか?
- 16. x86デコード命令opcodeバイト
- 17. Intel x86命令のエンコーディングを見るためのツールがありますか?
- 18. x87 FPOP命令とFCOM命令 - どのように動作しますか?
- 19. `test`命令はどのように機能しますか?
- 20. MOVSXアセンブリ命令はどのように機能しますか?
- 21. x86 mov命令が異なるサイズのCポインタにあります
- 22. 理解のx86 R/m32の命令
- 23. アトミック命令はキャッシュラインにまたがることができますか?
- 24. アセンブリ命令には計算がありますが、これはどのように機能しますか?
- 25. x86命令の機能別リファレンス
- 26. Direction/Sign x86命令セットのビット拡張
- 27. x86 assembly-masm32:無効な命令のオペランド
- 28. X86アセンブリ - IDIV命令の処理
- 29. SQL多命令アトミック性質問
- 30. 1つの命令と1つの命令を結合するにはどうすればよいですか?
LOCKで接頭辞を付けると、それは_原子_です。それは非常に高価なので、通常、それは誰が望んでいないものです。したがって、あなたが望むものを明示する必要があります。 – Damon
1ワード:パイプライン –
原子はそれが1つの命令であることを意味するものではなく、1つの不可分な動作であることを意味します。そして、メモリオペランドとの 'inc'はそうではなく、デフォルトではありません。 – harold