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.toml에서 rust.lto 구성 옵션을 "thin"으로 설정하십시오:

rust.lto = "thin"

rustc의 LTO는 현재 x86_64-unknown-linux-gnu 타깃에서만 지원되고 테스트된다는 점에 유의하십시오. 다른 타깃에서도 동작할 수는 있지만, 동작이 보장되지는 않습니다. 특히 LTO로 최적화된 rustc는 현재 Windows에서 잘못된 컴파일을 일으킵니다.

Linux에서 LTO를 활성화하여 최대 10%의 속도 향상을 얻은 바 있습니다.

메모리 할당자

rustc에 다른 메모리 할당자를 사용하면 상당한 성능 이점을 얻을 수 있습니다. jemalloc 할당자를 활성화하려면 bootstrap.toml에서 build.allocator 옵션을 jemalloc으로 설정하면 됩니다:

build.allocator = "jemalloc"

이 옵션은 현재 Linux와 macOS 타깃에서만 지원된다는 점에 유의하십시오.

코드 생성 단위

rustc 크레이트당 코드 생성 단위 수를 줄이면 더 빠른 컴파일러 빌드를 만들 수 있습니다. bootstrap.toml에서 다음 옵션으로 rustc와 libstd의 코드 생성 단위 수를 변경할 수 있습니다:

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

명령어 집합

기본적으로 rustc는 가능한 한 많은 CPU를 지원하기 위해 (선택한 타깃에 따라) 제네릭한(그리고 보수적인) 명령어 집합 아키텍처를 대상으로 컴파일됩니다. 특정 명령어 집합 아키텍처를 대상으로 rustc를 컴파일하려면 RUSTFLAGS에서 target_cpu 컴파일러 옵션을 설정하면 됩니다:

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

LLVM도 특정 명령어 집합을 대상으로 컴파일하려면 bootstrap.toml에서 llvm 플래그를 설정하면 됩니다:

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

프로파일 기반 최적화

프로파일 기반 최적화(더 일반적으로는 피드백 기반 최적화)를 적용하면 rustc의 성능을 최대 15%까지 크게 높일 수 있습니다(1, 2). 하지만 이러한 기법은 구성 옵션 하나로 간단히 활성화되지 않으며, rustc를 여러 번 컴파일하고 선택한 벤치마크에서 프로파일링하는 복잡한 빌드 워크플로가 필요합니다.

최종 사용자에게 배포하는 빌드를 위해 PGO(프로파일 기반 최적화)와 BOLT(링크 후 바이너리 최적화 도구)로 rustc를 최적화하는 데 사용하는 opt-dist라는 도구가 있습니다. src/tools/opt-dist에 있는 이 도구를 살펴보고 이를 바탕으로 사용자 정의 PGO 빌드 워크플로를 구성하거나, 도구를 직접 사용해 볼 수 있습니다. 이 도구는 현재 Rust의 지속적 통합 워크플로에서 사용하는 방식에 맞춰 상당 부분 하드코딩되어 있으므로, 다른 환경에서 동작하게 하려면 별도의 수정이 필요할 수 있다는 점에 유의하십시오.

이 도구를 사용하려면 몇 가지 외부 의존성을 준비해야 합니다:

  • Python3 인터프리터(x.py 실행용)
  • llvm-profdata 바이너리가 포함된 컴파일된 LLVM 툴체인 선택적으로 BOLT를 사용하려면 툴체인에 llvm-bolt 및 merge-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> \ # select target, e.g. "x86_64-unknown-linux-gnu"
      --checkout-dir <path>    \ # path to rust checkout, e.g. "."
      --llvm-dir <path>        \ # path to built LLVM toolchain, e.g. "/foo/bar/llvm/install"
      -- ./x dist       # pass the actual build command
    
    --help를 실행하면 수정할 수 있는 추가 매개변수를 확인할 수 있습니다.

참고: opt-dist를 로컬에서 실행하는 대신 실제 CI 파이프라인을 실행하려면 cargo run --manifest-path src/ci/citool/Cargo.toml run-local dist-x86_64-linux를 실행하면 됩니다.