컴파일러 최적화 빌드
가능한 한 최적화된 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 외부에서) 사용하는 방법의 예시입니다:
opt-dist는 메트릭이 활성화되어 있다고 가정하므로bootstrap.toml파일에서 메트릭을 활성화하십시오:build.metrics = true- 다음 명령으로 도구를 빌드하십시오:
./x build tools/opt-dist 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를 실행하면 됩니다.