ホームページ >バックエンド開発 >C++ >C の制限にもかかわらず、Double と Vector のアトミック操作を x86_64 でどのように実現できますか?

C の制限にもかかわらず、Double と Vector のアトミック操作を x86_64 でどのように実現できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-28 06:06:19396ブラウズ

How Can Atomic Operations on Doubles and Vectors Be Achieved on x86_64 Despite C   Limitations?

ロックフリーのサポートがない C の std::atomic の制限にもかかわらず、x86_64 は double および Vector に対する特定のアトミック操作に対してアセンブリ レベルのサポートを提供します。

アトミックな二重操作x86_64

  • 自然にアライメントされたロードとストア (最大 8 バイト) はアトミックです。
  • アトミックな読み取り、変更、書き込み操作 (RMW) には、cmpxchg による再試行ループが必要です.
  • cmpxchg16b は 16 バイトのアトミックに使用できます

x86_64 での SSE/AVX ベクトル操作

C には現在、アトミック AVX/SSE ベクトル操作のサポートがありませんが、全体にわたる 128b または 256b キャッシュ ラインのアトミック転送を保証する方法はありません。

ただし、整列された double の共有配列でベクトルのロード/ストアを使用する場合、ティアリングのリスクを最小限に抑えるために、特定の予防措置を講じることができます。

Atomic 16B Load

  • desired=expected を指定してロック cmpxchg16b を使用すると、アトミック 16B ロード。

アトミック 16B ストアと RMW

  • ロック cmpxchg16b は、アトミック 16B ストアと RMW 操作に使用できます。

アトミック半分の 8B を持つ 16B オブジェクトの操作

  • 半分の 8B を独立して読み取りながら、16B オブジェクトをアトミックに更新することが可能です。

コンパイラとアトミック操作

コンパイラーは、アトミック操作に最適なアセンブラー コードを常に生成するとは限りません。たとえば、XMM と二重レジスタ間の直接 movsd ロード/ストアを回避し、代わりに迂回メソッドを選択する場合があります。

以上がC の制限にもかかわらず、Double と Vector のアトミック操作を x86_64 でどのように実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。