x86-64-v2 マイクロアーキテクチャレベル用にRed Hat Enterprise Linux 9 をビルドする

この記事はBuilding Red Hat Enterprise Linux 9 for the x86-64-v2 microarchitecture level | Red Hat Developer の翻訳です。 Red Hat Enterprise Linux 9 はこの記事で紹介されている x86-64-v2 アーキテクチャむけにビルドされています。


Linuxディストリビューションを構築する際、初期に決定する最も重要なことの1つが、サポートするハードウェアの範囲です。ディストリビューションのデフォルトのコンパイラ・フラグは、ハードウェア・プラットフォームの互換性にとって重要です。新しいCPU命令を使用するプログラムは、古いCPUでは動作しないかもしれません。この記事では、Red Hat Enterprise Linux (RHEL) 9のx86-64バージョンをビルドするための新しいアプローチについて説明し、そのビルドに関するRed Hatの推奨事項を共有します。

x86-64マイクロアーキテクチャレベルの背景

GNU Cライブラリ(glibc)は、すべてのシステムに存在するとは限らない追加のハードウェア機能を使用する最適化されたライブラリをロードする方法を提供しています。元々、このメカニズムは、通常 /usr/lib64ディレクトリにインストールされるデフォルト(フォールバック)実装に加え、おそらく1つか2つの代替ライブラリ実装をサポートするように設計されています。しかし、ライブラリ検索機構によるパワーセット構築は、CPUのオプション機能が数多く存在する現在のプラットフォームにはうまくマッチしません。特にx86アーキテクチャでは、長年にわたって多くのオプション機能が追加されています (一覧はCPUID命令のWikipediaの記事を参照してください)。このような選択肢の多さは、ダイナミックリンカーだけでなく、プログラマーにとっても問題です。最近まで、最適化されたライブラリでどのようなCPUの機能を想定すべきか、ほとんど指針がありませんでした。GCCとglibcは機能セットの定義について意見が分かれておりglibcの選択機構はベンダーごとに異なっています

2020年夏、AMD、Intel、Red Hat、SUSEは共同で、x86-64ベースラインの上に3つのx86-64マイクロアーキテクチャのレベルを定義しました。3つのマイクロアーキテクチャは、ハードウェアのリリース日に基づいて、CPUの機能を大まかにまとめています。

  • x86-64-v2では、Streaming SIMD Extensions 4.2(SSE4.2)およびSupplemental Streaming SIMD Extensions 3 (SSSE3) までのベクトル命令、POPCNT命令 (データ解析や一部のデータ構造でのビット操作に有用)、CMPXCHG16B (並列アルゴリズムに有用な2ワードの比較およびスワップ命令) などがサポートされています。
  • x86-64-v3は、AVX2までのベクトル命令、MOVBE(ビッグエンディアン・データ・アクセス用)、および追加のビット操作命令を追加しました。
  • x86-64-v4では、AVX-512の一部のバリエーションからベクタ命令が追加されました。

x86-64のpsABIの補足で、3つのレベルの詳細を文書化しました。今後リリースされるGCCバージョン11とLLVMバージョン12では、 -march= 引数でこれらをサポートする予定です。 (パワーセット構築ではない)新しいメカニズムでglibcダイナミックローダを拡張するパッチがglibc-hwcapsの名前でglibcに組み込まれました。これらの変更はglibcの次期2.33リリースの一部となる予定です。

RHEL 9のアーキテクチャに関する考慮点

これまで、x86_64 Red Hat Enterprise Linuxのユーザースペースは、AMD K8ベースラインからAMD固有の3Dnow! を除いたものでした。この決定は、最新バージョンの Red Hat Enterprise Linux 8 まで維持されています。しかし、カーネルドライバが削除されたため、古いハードウェア (第一世代のOpteron CPUを搭載したシステムなど) ではRed Hat Enterprise Linuxを有用な形で実行できません。また、古いハードウェアを実行する場合、大きな電力を必要とします。

今までにも、IFUNC関数のマルチバージョン化dlopenによる代替実装のロードなどのメカニズムによって、新しいCPU機能を利用できましたが、これは現在進行中のglibc-hwcaps作業で自動化できる可能性があります。これらのアプローチはそれぞれ、特に指定されたコードのブロックにのみ適用されます。ディストリビューションの残りの部分はまだ追加のCPU機能を採用していないため、CPUのこれらの部分は本質的に休止状態になっています。

x86-64マイクロアーキテクチャレベルを定義することの歓迎すべき副次的効果として、Linuxディストリビューションのアーキテクチャのベースラインを議論するための便利な言語を手に入れました。このままオリジナルのK8ベースラインを使うことも、後の3つのレベルのうち1つを適用することもできます。

RHEL 9での推奨

Red Hat Enterprise Linux 9では、x86-64-v2が適切な選択であると考えます。 この推奨は、以下の見解に基づいています。

  • ホストがサポートしているにもかかわらず、x86-64-v2 CPU機能を人為的にマスクする仮想マシンモデルは、比較的簡単に調整できます。
  • 次のレベルであるx86-64-v3は、x86-64アーキテクチャ用に1つの統一ディストリビューションを構築する予定であるため、使用できない。
  • 2020年発売の新サーバークラスCPUは、AVX命令セットを実装していません。
  • AVX命令も一部のソフトウェア実装では利用できません(valgrindツールはサポートしていますが)。エミュレーションのサポートがないため、Red Hat Enterprise Linux 9をターゲットとする開発者が制約を受ける可能性があります。

以前のRed Hat Enterprise Linuxバージョンと同様に、IFUNCと関数のマルチバージョン化によって (x86-64-v2以外の) 他のCPU機能を引き続きサポートする予定です。また、最適化されたバージョンのライブラリをロードするためにglibc-hwcapsメカニズムを使用する可能性もあります。通常通り、これらの計画はRed Hat Enterprise Linux 9のリリース前に随時変更される可能性があります。

現在のところ、Fedora ELN以外のFedoraにはこの変更は適用されません。(訳注: 記事執筆時点である2021年1月の状況です。)

他のアーキテクチャのサポート

ハードウェアパートナーとともに、Red Hatはすべてのアーキテクチャのベースラインを定期的に見直しています。IBM POWERとIBM Zについては、歴史的にメジャーリリースごとにベースラインを更新してきました。例えば、Red Hat Enterprise Linux 8にはPOWERリトルエンディアン (ppc64le) と、s390xアーキテクチャではz13以降のCPUが必要です。

まとめ

この記事では、Red Hat Enterprise Linux 9のx86-64マイクロアーキテクチャレベルを選択するRed Hatのアプローチを導く基準について説明しました。 推奨するx86-64-v2は、追加のベクトル命令 (SSE4.2およびSSSE 3まで)、データ分析用のPOPCNT命令、並列処理アルゴリズム用のCMPXCHG16B命令をサポートします。

最終更新日2021年1月29日

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。