x86-64 マイクロアーキテクチャーレベル
x86-64 プロセッサーがどれだけ新しいかを示す、累積的な 4 つの機能セットです。コンパイラー、glibc の動的ローダー、Linux ディストリビューションがいずれもこれらを使います。
AMD が 2003 年に導入した 64 ビット x86 アーキテクチャーが保証するのは SSE2 までで、それより新しいものは保証しません。その後もプロセッサーには SSE3 から AVX-512 まで命令が追加され続けましたが、単なる「x86-64」向けにビルドされたプログラムは、実行時に確認しない限り、そのどれも前提にできませんでした。
2020 年、x86-64 用の System V 呼び出し規約とオブジェクト形式を定める文書である x86-64 psABI が、このベースラインの上に積み重なる 3 つの機能セットに名前を付けました。各セットは、Intel と AMD のプロセッサーがまとめて搭載してきた命令をグループにしたものです。
| レベル | 追加される機能 | 最初の Intel | 最初の AMD |
|---|---|---|---|
| x86-64-v1 | CMOV、CX8、FPU、FXSR、MMX、OSFXSR、SCE、SSE、SSE2 | NetBurst (Prescott, Nocona) (2004 年) | K8 (Hammer) (2003 年) |
| x86-64-v2 | CMPXCHG16B、LAHF-SAHF、POPCNT、SSE3、SSE4.1、SSE4.2、SSSE3 | Nehalem (2008 年) | Bulldozer (2011 年) |
| x86-64-v3 | AVX、AVX2、BMI1、BMI2、F16C、FMA、LZCNT、MOVBE、OSXSAVE | Haswell (2013 年) | Excavator (2015 年) |
| x86-64-v4 | AVX512F、AVX512BW、AVX512CD、AVX512DQ、AVX512VL | Skylake-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 のハイブリッドチップも含めて示します。