x86 でのロードとストアのアトミック性
std::atomic のメモリ操作はバス ロックのみに依存しているという印象にもかかわらず、アトミック操作実際にはキャッシュ内で実行されます。
キャッシュコヒーレンス
キャッシュ コヒーレンスにより、すべてのコアがメモリの一貫したビューを持つことが保証されます。キャッシュ ラインは、アトミック チャンクでコアとメモリ間で転送されます。これにより、外部バス ロックに依存せずに、キャッシュ内でアトミック操作を実行できるようになります。
アラインされた操作
最大 64 ビットのアラインされたロードおよびストア操作が保証されます。 x86 プロセッサ上のアトミック。これは、整列されたアクセスが、操作全体に対応できる十分な幅のデータ パスを介して転送されるためです。
整列されていない操作
整列されていないロードとストアは非アトミックになる可能性があります。完了するまでに複数のアクセスが必要になる場合があるためです。たとえば、キャッシュライン境界を越えるロードまたはストアは 2 つの個別のアクセスで実行する必要があり、非アトミックになります。
アトミック読み取り、変更、書き込み操作
lock add [mem]、eax などのアトミックな読み取り、変更、書き込み操作は、単純なロードやストアよりも実装が複雑です。これらの操作では、コアが影響を受けるキャッシュ ラインを変更された状態に保持し、操作が完了するまで外部からの変更を防ぐ必要があります。非整列の読み取り、変更、書き込み操作では、バスをロックし、他のコアが影響を受けるメモリにアクセスできないようにするために、LOCK# 信号をアサートする必要がある場合があります。
コンパイラーの最適化
コンパイラーは、 x86 メモリの順序付けにより LoadLoad と LoadStore が妨げられるため、mfence 命令を省略して seq_cst ロードを最適化します。並べ替え中。ただし、StoreLoad の並べ替えを防ぐために、seq_cst ストアには依然としてフェンスが必要です。
要約すると、x86 プロセッサ上のアトミック性は、キャッシュ コヒーレンス、アライメントされた操作、およびアライメントされていない読み取り、変更、書き込み操作のバス ロックの組み合わせによって実現されます。 。これにより、システム全体のパフォーマンスに影響を与えることなく、アトミック操作を効率的に実行できます。
以上がx86 のロードとストアはアトミックですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。