2012-04-11 27 views
19

私はx86のINC命令がアトミックではないことを読みました。私の質問はどのように来るのですか? INC命令はメモリ変数とレジスタの両方で動作するため、x86-64上で64ビット整数をインクリメントしているとします.1つの命令で実行できます。だから、それはどのように原子ではないのだろうかx86のINC命令はどのようにアトミックではありませんか?

+3

LOCKで接頭辞を付けると、それは_原子_です。それは非常に高価なので、通常、それは誰が望んでいないものです。したがって、あなたが望むものを明示する必要があります。 – Damon

+0

1ワード:パイプライン –

+4

原子はそれが1つの命令であることを意味するものではなく、1つの不可分な動作であることを意味します。そして、メモリオペランドとの 'inc'はそうではなく、デフォルトではありません。 – harold

答えて

18

なぜでしょうか?プロセッサー・コアは、依然としてメモリー位置に格納された値を読み取り、その増分を計算してから戻す必要があります。読み込みと保存の間には待ち時間があり、その間に別の操作がそのメモリの場所に影響を与える可能性があります。

アウトオブオーダーで実行されても、プロセッサコアは自分の命令を超えないように十分にスマートであり、時間差でこのメモリを変更する責任を負いません。ただし、別のコアがその場所を変更する命令を発行した可能性があります.DMA転送がその場所に影響を与えたか、または他のハードウェアがそのメモリ場所に何らかの形で触れた可能性があります。

+2

「別の操作」が何を意味するのか、もう少し明確にする必要があります。確かに、他のコア/ CPUや他のハードウェアがメモリバスを迂回するだけで、同じCPUコアで他の動作は起こり得ません。 –

+1

投稿を更新しました。 – Kaganar

1

あなたはあなたがそれを必要としない限り、本当にAgner FogSoftware optimization resourcesから、保証アトミック操作をしたくない:instruction_tables.pdf(1996年から2017年):LOCKプリフィックスと

命令は、その長い待ち時間を持っていますキャッシュ構成とおそらくRAMの速度に依存します。複数のプロセッサまたはコアまたはダイレクトメモリアクセス(DMA)デバイス がある場合、すべてのロックされた命令は排他アクセスのためにキャッシュラインをロックします。これにはRAMアクセスが含まれます。 LOCKプレフィックスは通常、シングルプロセッサの システムでも100クロックサイクル以上のコストがかかります。これは、メモリオペランドを持つXCHG命令にも適用されます。

+1

この情報は確かに時代遅れです。ミューテックス全体のロック/アンロックサイクルは、テストした1台のマシンで90サイクル以下で、複数のロックプレフィックス演算とrdtscオーバーヘッドが必要です。 rdtscの間で単一のロックinc命令でテストすると、いつでも(nopと同じ時間で)測定することさえできませんでした。最近のcpusでは、メモリが他のコアと共有されていない限り、ロックの接頭辞は時間を増やさないようです。 –

+0

@R .. - x86-64は2003年から提供されているので、おそらく包括的な記述です。私はそれが保留中の割り込み/ ctxスイッチにどのように影響するのだろうかと思います。 –

+3

@ R ..まあ、90未満で100以上はそれほど離れていません:-) – hirschhornsalz

18

実行パイプラインの一部としての現代の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 ]と書かれている場合は、パイプラインの「コンパイル」ステージに、別の方法で分解してアトミック性要件が満たされていることを伝えます。

この理由は他の人によっても言及されているようです - スピード;何かを原子力にして、必ずしも必要ではないとしても必ず遅くするのですか?

+2

"ミニオペレーション"分解は、単一のCPUコアが途中で中断できないため、アトミック性とは無関係です。実際、ロックプレフィックスのないincは、シングルコアマシンでは完全に原子的です。これは、他のコア(またはあいまいなことに、バス上の他のハードウェア)がロック接頭辞が関係するメモリにアクセスできるときだけです。 –

+1

@R ..:そういう意味で、シングルコアの_any_ modify-mem cpu opは、どのようにしてもアトミックでした。しかし、バスマスタリングのDMA /メモリバスはペリフェラルと共有されているため、キャッシュの一貫性とアトミック性の問題が存在するため、シングルコアのマシンでさえも「シングル」ではありません。常に複数のメモリバスクライアントがあります。したがって、ロード/ストアは、メモリバスレベルでは、たとえ "シングル" CPU命令の一部として実行されたとしても常に_分解されます。アトミック性はアサートされなければならない(排他的メモリバスアクセス)。 CPUはload/change/storeとしてmodify-memを実行することはできませんが、バスのロック/アンロックでブラケットする必要があります。 –

+0

@R ..:ARM CPUは、例えば、LDREX/STREXを介して、命令セットレベルのアトミシティのバスロックの必要性を明示的に示します。 x86がmem-modify命令を持っているという事実から、explicitnessの必要性はないと結論づけることはできません。また、問題は、中間命令を中断することではなく、原子性と同じではありません。 _single_命令のメモリアクセスは他のCPUのメモリアクセスと_race _することができるので、分解はその意味で強く重要です。命令が完了すると(再始動を必要とするトラップはない)、結果は(「ロック」なしで)一意/確定的ではない。 –

関連する問題