x86_64 での double と Vector のアトミック操作
C 11 std::atomicほとんどの実装でロックフリー操作を提供しますが、アトミック AVX または SSE ベクトル操作は依然として CPU に依存し、アセンブリ レベルのサポートがありません。
Double でのアトミック操作
- ロードおよびストア操作は、倍精度を含む 8 バイトに対して当然アトミックです。
- 読み取り、変更、書き込みの操作が必要です。直接のメモリ宛先命令がないため、cmpxchg (または TSX) による再試行ループ。
- Cmpxchg16b は、16 バイトのアトミック RMW 操作に使用できます。
- IEEE float 操作の一部の特殊なケースでは、整数演算 (絶対値、否定).
ベクトルに対するアトミック操作
- キャッシュ コヒーレンシ システム全体でのアトミック ベクトル ロード/ストア操作に対するハードウェア サポートはありません。
- double の整列配列に対するベクトルのロード/ストアは、危険を冒さずに安全に使用できる可能性があります。キャッシュライン ティアリング。
- 16 バイトのアトミック ロード/ストア/RMW の場合、cmpxchg16b を使用できます。
- 16 バイトのオブジェクトをアトミックに更新することは可能ですが、8 バイトの半分を個別に読み取ることができます。であることは保証されていませんatomic.
コンパイラのサポート
- コンパイラは常に atomic の効率的なアセンブリを生成するとは限りません。ロード/ストア (例: xmm レジスタとの間で直接 mov 命令を使用するなど)。
- アトミック ベクトル (アトミック<__m128d> またはアトミック<__m256d>) は、読み取り専用であっても cmpxchg16b を必要とするため、効率的に実装されません。または書き込み専用操作。
以上がx86_64 では Double および Vector 演算はどの程度アトミックですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。