Visual Studio 2022 version 17.14m64向け/forceInterlockedFunctionsスイッチ導入でアトミック操作の効率化

記事の要約

  • Visual Studio 2022 version 17.14で/forceInterlockedFunctionsスイッチが導入された
  • Arm64アーキテクチャにおけるアトミック操作の効率化を実現する
  • Armv8.0ではデフォルトで有効mv8.1+では無効

Visual Studio 2022 version 17.14の新機能/forceInterlockedFunctionsスイッチ

Microsoftは2025年5月13日、Visual Studio 2022 version 17.14においてm64アーキテクチャ向けの新しいコンパイラスイッチ/forceInterlockedFunctionsを導入した。このスイッチは、CPUのサポートに基づいてArmv8.1+ Large System Extension (LSE)アトミック命令を選択するアウトオブラインアトミックを生成し、リンクする機能を提供するのだ。

Armv8.0では、このスイッチはデフォルトで有効になっている。これはmv8.0のインターロック型組み込み関数が、フォワードプログレスを保証しない排他的命令(LoadExcl/StoreExcl)を使用するため、パフォーマンスの問題を引き起こす可能性があるためだ。Armv8.1+では、このスイッチはデフォルトで無効になっている。

このスイッチを使用することで、_InterlockedAdd64などのインターロック型組み込み関数の性能が向上し、livelockの問題を回避できるようになる。具体的には、従来のldaxrとstlxr命令が、bl _InterlockedAdd64命令に置き換えられるのだ。

Arm64ECバージョンでは、このオプションはデフォルトで有効になっている。Arm64とx64のメモリモデルの違いに対処するために、アウトライン化が役立つためm64ECではこのオプションを無効にすることは推奨されない。

/forceInterlockedFunctionsスイッチの詳細と影響を受ける組み込み関数

操作8163264128ポインタ
AddNoneNoneFullFullNoneNone
AndFullFullFullFullNoneNone
CompareExchangeFullFullFullFullFullFull
DecrementNoneFullFullFullNoneNone
ExchangeFullFullFullFullNoneFull
ExchangeAddFullFullFullFullNoneNone
IncrementNoneFullFullFullNoneNone
OrFullFullFullFullNoneNone
XorFullFullFullFullNoneNone
bittestandsetNoneNoneFullFullNoneNone
bittestandresetNoneNoneFullFullNoneNone

Arm64アトミック命令とLSE

このスイッチはm64アーキテクチャにおけるアトミック操作に影響を与える。特にmv8.0とArmv8.1+では、アトミック命令の実装が異なるため、パフォーマンスに違いが生じる可能性がある。

  • Armv8.0は排他的命令を使用し、livelockのリスクがある
  • Armv8.1+はLSE命令を使用し、パフォーマンスが向上する
  • LSE命令は、より効率的なアトミック操作を実現する

そのため、/forceInterlockedFunctionsスイッチはmv8.0におけるパフォーマンス問題の解決に役立つ。また、LSEの有効化はmv8.0におけるデフォルトのアウトライン化動作を上書きするのだ。

/forceInterlockedFunctionsスイッチに関する考察

Visual Studio 2022 version 17.14で導入された/forceInterlockedFunctionsスイッチはm64アーキテクチャにおけるアトミック操作のパフォーマンス向上に大きく貢献するだろう。特にArmv8.0におけるlivelock問題の軽減は、開発者の生産性向上に繋がる重要な改善点だ。しかし、このスイッチの導入によって、予期せぬ互換性の問題が発生する可能性も考慮する必要がある。

今後、より多くのArm64デバイスが普及するにつれて、このスイッチの重要性はますます高まるだろう。そのため、Microsoftは、このスイッチの動作に関する詳細なドキュメントを提供し、開発者がスムーズに移行できるようサポートする必要がある。また、将来的なArmアーキテクチャの進化にも対応できるよう、このスイッチの機能を継続的に改善していくことが重要だ。

さらに、このスイッチの動作をより詳細に分析し、様々な状況下でのパフォーマンスを評価する必要がある。これにより、開発者は、最適な設定を選択し、アプリケーションのパフォーマンスを最大限に引き出すことができるだろう。将来的には、このスイッチの設定を自動的に最適化する機能の追加も期待される。

参考サイト/関連サイト

  1. Microsoft Dev Blogs.「Introducing the /forceInterlockedFunctions switch for ARM64 – C++ Team Blog」.https://devblogs.microsoft.com/cppblog/introducing-the-forceinterlockedfunctions-switch-for-arm64/, (参照 2025-05-15).

関連タグ