Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

コンパイラの最適化ビルド

可能な限り最適化された rustc のビルドをコンパイルするために使用できる、追加のビルド設定オプションやテクニックが複数あります(たとえば Linux ディストリビューション向けに rustc をビルドする場合)。 さまざまな Rust ターゲットに対するこれらの設定オプションの状況は、こちらで追跡されています。 このページでは、自分で rustc をビルドする際に、これらの手法をどのように使用できるかを説明します。

リンク時最適化

リンク時最適化は、プログラムのパフォーマンスを向上させることができる強力なコンパイラ技法です。 rustc をビルドする際に (Thin-)LTO を有効にするには、bootstrap.tomlrust.lto 設定オプションを "thin" に設定します。

rust.lto = "thin"

rustc 向けの LTO は、現在 x86_64-unknown-linux-gnu ターゲットでのみサポートおよびテストされていることに注意してください。他のターゲットでも動作する可能性はありますが、保証はありません。 特に、LTO で最適化された rustc は、現在 Windows で誤ったコンパイルを生成します。

Linux で LTO を有効にすると、最大 10% の高速化が得られています

メモリアロケータ

rustc に別のメモリアロケータを使用すると、大きなパフォーマンス上の利点が得られる場合があります。 jemalloc アロケータを有効にしたい場合は、bootstrap.tomlrust.jemalloc オプションを true に設定できます。

rust.jemalloc = true

このオプションは現在、Linux および macOS ターゲットでのみサポートされていることに注意してください。

コード生成ユニット

rustc クレートごとのコード生成ユニット数を減らすと、コンパイラのより高速なビルドを生成できます。 bootstrap.toml で以下のオプションを使用すると、rustclibstd のコード生成ユニット数を変更できます。

rust.codegen-units = 1
rust.codegen-units-std = 1

命令セット

デフォルトでは、rustc は(選択されたターゲットに応じて)汎用的で保守的な命令セットアーキテクチャ向けにコンパイルされ、できるだけ多くの CPU をサポートするようになっています。 特定の命令セットアーキテクチャ向けに rustc をコンパイルしたい場合は、RUSTFLAGStarget_cpu コンパイラオプションを設定できます。

RUSTFLAGS="-C target_cpu=x86-64-v3" ./x build ...

LLVM も特定の命令セット向けにコンパイルしたい場合は、bootstrap.tomlllvm フラグを設定できます。

llvm.cxxflags = "-march=x86-64-v3"
llvm.cflags = "-march=x86-64-v3"

プロファイル誘導最適化

プロファイル誘導最適化(または、より一般的にはフィードバック指向最適化)を適用すると、rustc のパフォーマンスを最大 15% まで大きく向上させることができます(12)。 ただし、これらの技法は設定オプションで単純に有効化できるものではなく、rustc を複数回コンパイルし、選択したベンチマークでプロファイルする複雑なビルドワークフローが必要です。

エンドユーザーに配布されるビルド向けに、PGO(プロファイル誘導最適化)と BOLT(リンク後バイナリオプティマイザ)を使用して rustc を最適化するために使われる opt-dist というツールがあります。 src/tools/opt-dist にあるこのツールを調査し、それをベースにカスタム PGO ビルドワークフローを構築することも、直接使用してみることもできます。 このツールは現在、Rust の継続的インテグレーションワークフローでの使い方にかなりハードコードされており、異なる環境で動作させるには、いくつかのカスタム変更が必要になる可能性があることに注意してください。

このツールを使用するには、いくつかの外部依存関係を用意する必要があります。

  • Python3 インタープリタ(x.py を実行するため)。
  • llvm-profdata バイナリを含む、コンパイル済みの LLVM ツールチェーン。 必要に応じて、BOLT を使用したい場合は、 llvm-boltmerge-fdata バイナリがツールチェーン内で利用可能でなければなりません。

これらの依存関係は、Environment 構造体の実装によって opt-dist に提供されます。 これは、PGO/BOLT パイプラインが実行されるディレクトリと、Python や LLVM などの外部依存関係も指定します。

以下は、opt-dist をローカルで(CI の外部で)使用する方法の例です。

  1. opt-dist はメトリクスが有効になっていることを想定しているため、bootstrap.toml ファイルでメトリクスを有効にします。
    build.metrics = true
    
  2. 次のコマンドでツールをビルドします。
    ./x build tools/opt-dist
    
  3. local モードでツールを実行し、必要なパラメータを指定します。
    ./build/host/stage1-tools-bin/opt-dist local \
      --target-triple <target> \ # ターゲットを選択します。例: "x86_64-unknown-linux-gnu"
      --checkout-dir <path>    \ # rust チェックアウトへのパス。例: "."
      --llvm-dir <path>        \ # ビルド済み LLVM ツールチェーンへのパス。例: "/foo/bar/llvm/install"
      -- python3 x.py dist       # 実際のビルドコマンドを渡します
    
    変更可能な追加パラメータを確認するには、--help を実行できます。

注: opt-dist をローカルで実行する代わりに、実際の CI パイプラインを実行したい場合は、 cargo run --manifest-path src/ci/citool/Cargo.toml run-local dist-x86_64-linux を実行できます。