ホームページ > バックエンド開発 > C++ > x86_64 アーキテクチャではアトミック浮動小数点演算とベクトル演算はどのように処理されますか?

x86_64 アーキテクチャではアトミック浮動小数点演算とベクトル演算はどのように処理されますか?

Mary-Kate Olsen
リリース: 2024-12-07 06:08:15
オリジナル
483 人が閲覧しました

How are Atomic Floating-Point and Vector Operations Handled on x86_64 Architectures?

x86_64 でのアトミック浮動小数点演算

C はネイティブにアトミックな double 演算をサポートしていませんが、ロックフリーの atomic を提供します。ほとんどのプラットフォームに実装されています。これらの実装では通常、ロック cmpxchg 命令を使用した比較交換 (CAS) 操作が使用されます。

x86_64 でのアトミック ベクトル操作の場合、ハードウェアの直接サポートはありません。ただし、アライメントされた 128 ビットおよび 256 ビットのロードおよびストアは、通常、アトミックであることが保証されています。非整列ベクトル演算の場合、アトミック性の保証はそれほど明確ではありません。

Double および Vector 演算のアセンブリ レベルのサポート

x86_64 は、アトミック演算のアセンブリ レベルのサポートを提供します。ダブルスとベクトル:

  • Doubles: アトミックなロード、ストア、加算/減算/乗算演算は、メモリ宛先命令 movsd、movq、addsd、subsd、および mulsd を通じてサポートされます。
  • ベクトル: 整列128 ビットおよび 256 ビットのロードとストアは、AVX サポートを備えた x86_64 上でアトミックです。非整列ベクトル演算の場合、アトミック性の直接的なハードウェア保証はありません。

MSVC 2017 ロックフリー アトミックの実装

MSVC 2017ロックフリーのアトミックを実装します。倍幅整数レジスタを使用した演算。たとえば、ロード操作には次のものが含まれます。

CAS: movq QWORD PTR [dst_addr], rax  // 64-bit CAS
ログイン後にコピー

追加操作では次のものが使用されます。

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax  // 128-bit CAS
ログイン後にコピー

アトミック RMW (読み取り-変更-書き込み) 操作

fetch_add などのアトミックな読み取り-変更-書き込み (RMW) 操作には CAS ループが必要です 実装。 x86_64 では、CAS 命令は 16 バイトの操作 (cmpxchg16b) をサポートします。

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax
ログイン後にコピー

CAS ループはアトミック RMW 機能を提供しますが、アトミックなロードおよびストアよりも高価です。

追加注

  • 一部の x86 以外のハードウェアは、float/double 型のアトミックな追加操作をサポートしています。
  • インテルのトランザクション メモリ拡張機能 (TSX) は、アトミックな FP および SIMD 操作のサポートを向上させています。 .
  • コンパイラーは、atomic に対して非効率なコードを生成することがよくあります。
  • 整列された double の共有配列に対するアトミック操作は安全である必要がありますが、整列されていないベクトルに対する操作はティアリングを伴う可能性があります。
  • 16 に対してアトミック操作を実装することは可能です。 -byte オブジェクトは cmpxchg16b を使用しますが、パフォーマンスは低下します。

以上がx86_64 アーキテクチャではアトミック浮動小数点演算とベクトル演算はどのように処理されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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