ホームページ > バックエンド開発 > C++ > x86_64 は倍精度浮動小数点値とベクトルに対する真のアトミック サポートを提供しますか?

x86_64 は倍精度浮動小数点値とベクトルに対する真のアトミック サポートを提供しますか?

DDD
リリース: 2024-12-02 02:57:10
オリジナル
793 人が閲覧しました

Does x86_64 Offer True Atomic Support for Double-Precision Floating-Point Values and Vectors?

x86_64 の double と Vector に対してアセンブリ レベルのアトミック サポートは利用可能ですか?

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 ビットのアトミック性を保証します。

16B オブジェクトに対するアトミック操作

16 バイトのオブジェクトに対してアトミック操作を実行するには、ネイティブのアトミック操作幅より大きい場合は、ロック cmpxchg16b を使用する必要があります。これにより、通常のアトミック操作と比較して大幅なパフォーマンスのオーバーヘッドが発生する可能性があり、パフォーマンスが重要なシナリオには適していません。

以上がx86_64 は倍精度浮動小数点値とベクトルに対する真のアトミック サポートを提供しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート