C 11 std::atomic
さらに、C 11 std::atomic は、整数または浮動小数点のいずれかに対してインテルのトランザクション メモリ拡張機能 (TSX) 用の API を提供しません。ポイント操作。 TSX は、汎用レジスタと浮動小数点レジスタ間のデータ移動に関連するオーバーヘッドを排除することで、アトミック操作のパフォーマンスを大幅に向上させることができます。
x86_64 にはアトミックが欠けていると言われているにもかかわらず、ベクトルのサポート、自然にアライメントされた最大 8 バイトのロードとストア (ベクトルを含む) は x86 プロセッサ上でアトミックです。これには、x87 または SSE 命令を使用したロードとストアが含まれます。したがって、倍精度浮動小数点値のアライメントされたロードとストアはアトミックです。
アトミックな読み取り、変更、書き込み操作 (アトミックな加算など) は次のとおりです。倍精度浮動小数点値またはベクトルは直接サポートされていません。 x86_64 でのこれらの操作の唯一のオプションは、cmpxchg 命令または TSX を使用した再試行ループです。
IEEE 浮動小数点演算のいくつかの特殊なケースは、整数を使用して実装できます。操作。たとえば、倍精度浮動小数点値の否定は、アトミック操作を使用して符号ビットを反転することで実現できます。
ただし、アトミックに対するハードウェア保証はありません。ベクトルのロードとストアでは、整列されたベクトルの倍精度浮動小数点値のロードとストアではティアリングが発生しないと一般的に想定して問題ありません。ただし、アライメントされていない値を含むアトミック ベクトル操作は安全ではない可能性があります。例外はインテルの AVX 機能で、SSE/AVX 操作の 128 ビットのアトミック性を保証します。
16 バイトのオブジェクトに対してアトミック操作を実行するには、ネイティブのアトミック操作幅より大きい場合は、ロック cmpxchg16b を使用する必要があります。これにより、通常のアトミック操作と比較して大幅なパフォーマンスのオーバーヘッドが発生する可能性があり、パフォーマンスが重要なシナリオには適していません。
以上がx86_64 は倍精度浮動小数点値とベクトルに対する真のアトミック サポートを提供しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。