AMD が 2003 年に導入した 64 ビット x86 アーキテクチャーが保証するのは SSE2 までで、それより新しいものは保証しません。その後もプロセッサーには SSE3 から AVX-512 まで命令が追加され続けましたが、単なる「x86-64」向けにビルドされたプログラムは、実行時に確認しない限り、そのどれも前提にできませんでした。

2020 年、x86-64 用の System V 呼び出し規約とオブジェクト形式を定める文書である x86-64 psABI が、このベースラインの上に積み重なる 3 つの機能セットに名前を付けました。各セットは、Intel と AMD のプロセッサーがまとめて搭載してきた命令をグループにしたものです。

x86-64 マイクロアーキテクチャーレベル。各レベルは、その上の行のレベルのすべての機能も必要とします。
レベル追加される機能最初の Intel最初の AMD
x86-64-v1CMOV、CX8、FPU、FXSR、MMX、OSFXSR、SCE、SSE、SSE2NetBurst (Prescott, Nocona) (2004 年)K8 (Hammer) (2003 年)
x86-64-v2CMPXCHG16B、LAHF-SAHF、POPCNT、SSE3、SSE4.1、SSE4.2、SSSE3Nehalem (2008 年)Bulldozer (2011 年)
x86-64-v3AVX、AVX2、BMI1、BMI2、F16C、FMA、LZCNT、MOVBE、OSXSAVEHaswell (2013 年)Excavator (2015 年)
x86-64-v4AVX512F、AVX512BW、AVX512CD、AVX512DQ、AVX512VLSkylake-SP (2017 年)Zen 4 (2022 年)

レベルは累積的です。プロセッサーが x86-64-v3 をサポートするのは、v3、v2、ベースラインのすべての機能を備えている場合だけです。機能が 1 つでも欠けていれば、より低いレベルに下がります。

レベルが使われる場所

コンパイラー
GCC 11 と Clang 12 で -march=x86-64-v2、-march=x86-64-v3、-march=x86-64-v4 が追加されました。Go 1.18 では GOAMD64=v1 から v4 までが追加されました (デフォルトは v1)。Rust は -C target-cpu=x86-64-v3 を通じて同じ名前を使います。
動的ローダー
glibc 2.33 以降、動的ローダーはライブラリパスの glibc-hwcaps/x86-64-v2、x86-64-v3、x86-64-v4 サブディレクトリから共有ライブラリの最適化されたコピーを探し、プロセッサーがサポートする最も高いレベルのものを読み込みます。
ディストリビューション
ディストリビューションはすべてのパッケージをあるレベル向けにビルドできます。そうすると、そのレベルがディストリビューションを動かすためにマシンに求められる最小要件になります。

オペレーティングシステムの関与

一覧の機能のうち OSFXSR と OSXSAVE の 2 つは、プロセッサーではなくオペレーティングシステムについて示すものです。幅の広い AVX レジスターは、コンテキストスイッチ時にその内容を保存する機能を OS が有効にして初めて使えます。そのため psABI は、プロセッサーが v3 と v4 をサポートし、かつ OS がその状態を有効にしている場合 (xgetbv で確認します) にだけ、それらを利用可能とみなします。

現在のオペレーティングシステムはすべてこれを有効にしています。これが問題になるのは仮想マシンの中です。ゲストに見せる機能はハイパーバイザーが決めるので、VM は自分が動いているマシンより低いレベルを報告することがあります。

v4 の先: AVX10 と APX

psABI は x86-64-v4 より後のレベルを定義していません。新しい拡張は代わりに 1 つずつ有効にします。たとえば GCC 15 では、AVX10.2 を -mavx10.2 で、APX を -mapxf で有効にします。

レベルと世代の違い

レベルは機能セットであり、年代ではありません。Alder Lake (2021 年) から Panther Lake (2026 年) までの Intel のノート PC 向けおよびデスクトップ向けハイブリッドプロセッサーは x86-64-v3 ですが、2019 年の Ice Lake のノート PC は x86-64-v4 です。2020 年の Pentium Silver は x86-64-v2 です。また、Haswell から Comet Lake までの Pentium と Celeron のモデルの大半は x86-64-v2 ですが、同じ世代の Core のモデルは v3 です。年ではなくモデルを確認してください。

  • x86-64-v1: x86-64 のベースライン (x86-64-v1) は、2003 年に登場した元の 64 ビット x86 機能セットです。機能、CPUID、Linux のフラグ、そしてこのレベルで止まるプロセッサーを示します。
  • x86-64-v2: x86-64-v2 は SSE3、SSSE3、SSE4.1、SSE4.2、POPCNT、CMPXCHG16B、LAHF/SAHF を追加します。機能、CPUID ビット、Linux のフラグ、そしてこのレベルをサポートするプロセッサーを示します。
  • x86-64-v3: x86-64-v3 は AVX、AVX2、BMI1、BMI2、F16C、FMA、LZCNT、MOVBE を追加します。機能、CPUID ビット、Linux のフラグ、そしてこのレベルをサポートするプロセッサーを、例外となるモデルも含めて示します。
  • x86-64-v4: x86-64-v4 は AVX-512 の F、BW、CD、DQ、VL を追加します。機能、CPUID ビット、Linux のフラグ、そしてこのレベルをサポートするプロセッサーを、サポートしない Intel のハイブリッドチップも含めて示します。

出典

  1. x86-64 psABI: Micro-Architecture Levels
  2. GCC 11 release notes
  3. Clang 12 release notes
  4. Go 1.18 release notes (GOAMD64)
  5. glibc 2.33 release notes (glibc-hwcaps)
  6. GCC 15 release notes (AVX10.2, APX)