나는 이것을 위해 GCC man 페이지를 스크럽하려고했지만 여전히 이해하지 못한다.
-march
과 의 차이점은 무엇입니까 -mtune
?
하나는 언제 -march
둘 다 사용합니까? 그냥 가능 -mtune
할까요?
답변
사용하는 -march
경우 GCC는 지정된 CPU에서 작동하지만 (일반적으로) 아키텍처 제품군의 이전 CPU에서는 작동하지 않는 명령을 자유롭게 생성 할 수 있습니다.
을 사용하는 경우 -mtune
컴파일러는 이들 중 하나에서 작동하는 코드를 생성하지만 지정한 특정 CPU에서 가장 빠르게 실행되는 명령어 시퀀스를 선호합니다. 예를 들어 해당 CPU에 대해 루프 풀기 휴리스틱을 적절하게 설정합니다.
-march=foo
의미 -mtune=foo
당신은 또한 다른를 지정하지 않는 한 -mtune
. 이것이 튜닝에 대해 아무것도하지 않고 -march
옵션을 활성화하는 것보다 사용하는 것이 더 나은 이유 중 하나 -mavx
입니다.
주의 사항 : -march=native
GCC가 특별히 인식하지 않는 CPU에서는 GCC가 감지 할 수있는 새 명령 세트를 활성화하지만 -mtune=generic
. 좋은 코드를 만들려면 CPU에 대해 알고있는 충분히 새로운 GCC를 사용하십시오.
답변
이것이 내가 검색 한 것입니다.
이 -march=X
옵션은 CPU 이름을 취하고 X
GCC가의 모든 기능을 사용하는 코드를 생성 할 수 있도록 X
합니다. GCC 매뉴얼은 어떤 CPU 이름이 어떤 CPU 제품군과 기능을 의미하는지 정확히 설명합니다.
기능은 일반적으로 추가되지만 제거되지는 않기 때문에로 빌드 된 바이너리 -march=X
는 CPU X
에서 X
실행되고 X
. 특정 명령 세트 (3DNow !, 내 생각 엔?)는 특정 CPU 공급 업체에 따라 다를 수 있으며,이를 사용하면 경쟁 CPU에서 실행되지 않는 바이너리를 얻을 수 있습니다.
이 -mtune=Y
옵션 Y
은 실행될 수있는 다른 CPU보다 빠르게 실행되도록 생성 된 코드를 조정합니다 . -march=X
을 의미합니다 -mtune=X
. -mtune=Y
대체하지 않습니다 -march=X
때문에, 예를 들어, 아마에 아무 의미, -march=core2
그리고 -mtune=i686
보다 오래된 아무것도 실행되지 않습니다 코드 – core2
때문에, 어쨌든 -march=core2
왜 지구에 당신이 코어 2 이상 (보다 풍부한 기능) 나이가 뭔가를 최적화하려는 것? -march=core2 -mtune=haswell
것 이상의 어떤 기능을 사용하지 않는 : 더 의미가 core2
제공합니다 (더 많은 것보다 아직이다 -march=i686
,하지만 훨씬 더 새로운 최적화 코드를 할 당신을 제공합니다!) haswell
하지 않는 CPU를, core2
.
또한 -mtune=generic
. generic
GCC는 현재 CPU에서 가장 잘 실행되는 코드를 생성합니다 ( generic
GCC의 한 버전에서 다른 버전으로 의 변경을 의미 함 ). 젠투 포럼에 소문이있다 -march=X -mtune=generic
빠르고에서 실행되는 코드를 생성 X
에 의해 생성 된 코드보다가 -march=X -mtune=X
(또는 않는 -march=X
등의 -mtune=X
암시가). 이것이 사실인지 아닌지는 모릅니다.
일반적으로 필요한 것이 무엇인지 정확히 알지 못하는 경우 가장 좋은 방법은 -march=<oldest CPU you want to run on>
및 -mtune=generic
( 가장 오래된 CPU에 대해 최적화하고 싶지 않기 때문에 -mtune=generic
암시 적에 대응하기 위해 여기에 있음 )를 지정하는 것 같습니다 -mtune=<oldest CPU you want to run on>
. 또는 -march=native
빌드하는 동일한 머신에서만 실행하려는 경우.