크로스 컴파일이 네이티브 컴파일보다 더 빠릅니까?

크로스 컴파일이 네이티브 컴파일보다 더 빠릅니까?

arm 기반(arm_v8-64, ubuntu20.04) 대상 머신과 amd 기반 호스트(x86_64, ubuntu20.04)가 있습니다.

호스트의 CPU가 대상의 CPU보다 훨씬 강력하기 때문에 크로스 컴파일이 네이티브 컴파일보다 빠를 수 있는지 궁금합니다. 진정한 크로스 컴파일 환경(QEMU와 같은 에뮬레이터가 아닌 모든 arm-libs를 복사하고 해당 툴체인을 사용하는 것과 같은)을 기반으로 한다는 의미입니다.

답변1

예, 크로스 컴파일은 일반적으로 느린 호스트에서 기본적으로 컴파일하는 것보다 빠릅니다. 프로그램이 x86에서 기본적으로 빌드되는 데 1분 정도 걸리면 x86 관리형 크로스 컴파일러를 사용하여 1분 안에 다른 대상으로 크로스 컴파일될 것으로 예상할 수 있습니다.

답변2

크로스 컴파일에 대한 오버헤드도 거의 없습니다. 호스트 크로스 컴파일은 기본적으로 일반 [비크로스] 컴파일과 동일한 작업을 수행합니다.

...고전력 크로스 컴파일 호스트는 일반적으로 저전력 호스트보다 훨씬 빠릅니다.

왜?

컴파일러 작동 방식

내가 기억하는 한, 2005년 대학에서 나는 컴파일러가 다음 단계를 수행한다고 배웠습니다.

  • 전처리 - #inclide균등화
  • 토큰 스트림 구문 분석 - 소스 코드를 단어 및 연산자 스트림으로 분할합니다.
  • 의미론적 구문 분석 - 예: 변수 이름을 함께 연결
  • 번역 - 의미 트리를 추상 프로그램으로 변환
  • 타일링 - 특정 아키텍처에 대한 추상 프로그램을 작성하기 위해 함께 그룹화되는 CPU 작업을 선택합니다.
  • 연결 - 프로그램 단위는 패치된 상호 참조 메모리 주소로 서로 연결됩니다.

아키텍처별 최적화는 여러 단계로 수행할 수 있지만 워크플로는 기본적으로 동일합니다.

"타일링"을 이해하는 것이 중요합니다. 추상 프로그램은 프로그램의 가장 원자적인 형태이지만 일반적으로 아키텍처와 독립적입니다. CPU 명령어는 단일 명령어(RISC 명령어 세트에서도)에서 여러 작업을 수행하는 경우가 많습니다. 타일링은 동일한 프로그램을 추상 프로그램으로 설명하기 위해 함께 그룹화되는 아키텍처 지시문을 선택합니다.

왠지 난 항상 테트리스같은 타일을 상상했어

크로스 컴파일러는 어떻게 다릅니까?

컴파일러 자체는 컴파일된 프로그램이라는 점을 기억하십시오.

크로스 컴파일러의 정의는 단순히 타일링 자체가 타일링하는 것과 다른 명령어 세트를 사용하는 컴파일러입니다.

따라서 x86_64->ARM 크로스 컴파일러는 ARM->ARM 컴파일러와 거의 동일한 추상 프로그램을 실행합니다!

  • x86 호스트용 x86 프로그램 컴파일과 ARM 프로그램 컴파일의 차이점은 단순히 타일링 시 컴파일러에서 사용하는 명령어 세트입니다.
  • x86 호스트에서 ARM 프로그램을 컴파일하는 것과 ARM 호스트에서 ARM 프로그램을 컴파일하는 것의 차이점은 컴파일러가 다른 명령어 세트를 사용한다는 것입니다.

컴파일 시간에 정말로 중요한 것은 무엇입니까?

따라서 중요한 것은 빌드 머신의 아키텍처가 아니라 머신의 원시 CPU 및 메모리 기능입니다.

관련 정보