ホームページ > バックエンド開発 > C++ > x86_64 は Double および SSE/AVX ベクトルに対するアトミック操作をサポートしていますか?

x86_64 は Double および SSE/AVX ベクトルに対するアトミック操作をサポートしていますか?

Mary-Kate Olsen
リリース: 2024-11-27 06:58:10
オリジナル
1037 人が閲覧しました

Does x86_64 Support Atomic Operations on Doubles and SSE/AVX Vectors?

x86_64 でのアトミック浮動小数点演算と SSE/AVX ベクトルのロード/ストア

C 11 はロックフリーの std::atomic をサポートしていますが、 CPU の依存関係により、現在アトミック AVX/SSE ベクトルはサポートされていません。しかし、次のような疑問が生じます: x86_64 は double またはベクトルに対するアトミック操作をアセンブリ レベルでサポートしていますか?

x86_64 でのアトミック操作

x86_64 は、lock- を使用して実行される double に対する次のアトミック操作をサポートしています。無料命令:

  • ロード
  • ストア
  • 加算
  • 減算
  • 乗算

アトミックベクトル演算x86_64

残念ながら、キャッシュ コヒーレンシ システム全体で 128b または 256b ベクトル ストアまたはロードのアトミック性を保証する方法はありません。ただし、整列されたベクトルの場合は、ティアリングのリスクなしに共有二重配列でのベクトルのロードとストアを安全に使用できます。

アトミック 16B ロードが必要な場合、唯一のオプションは、desired=expected を指定して lock cmpxchg16b を使用することです。成功すると、既存の値がそれ自体に置き換えられます。失敗すると、古いコンテンツが取得されます。この「ロード」は読み取り専用メモリ上で失敗するため、この操作を実行する関数にポインタを渡すときは注意してください。

アトミック 16B ストアと RMW は両方とも、明白な方法でロック cmpxchg16b を使用できます。これにより、特に cmpxchg16b の再試行が複数回行われる場合、純粋なストアは通常のベクター ストアよりもはるかに高価になります。ただし、アトミック RMW はすでに高価です。

アトミック ベクトル操作の制限

  • アトミック<__m128d> cmpxchg16b を使用しているため、読み取り専用または書き込み専用の操作であっても速度が遅くなります。
  • atomic<__m256d>ロックフリーにすることはできません。
  • alignas(64) atomic共有バッファ[1024];

16B オブジェクトのアトミックな読み取りと更新

16B オブジェクトをアトミックに更新できますが、8B の半分を個別に読み取ることができます。ただし、コンパイラーはこれを表現する明確な方法を提供しておらず、コンパイラー開発者による継続的な検討のため、cmpxchg16b のインライン化は信頼できません。

以上がx86_64 は Double および SSE/AVX ベクトルに対するアトミック操作をサポートしていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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