[optimization] GCC : 행진은 mtune과 어떻게 다른가요?

나는 이것을 위해 GCC man 페이지를 스크럽하려고했지만 여전히 이해하지 못한다.

-march과 의 차이점은 무엇입니까 -mtune?

하나는 언제 -march둘 다 사용합니까? 그냥 가능 -mtune할까요?



답변

사용하는 -march경우 GCC는 지정된 CPU에서 작동하지만 (일반적으로) 아키텍처 제품군의 이전 CPU에서는 작동하지 않는 명령을 자유롭게 생성 할 수 있습니다.

을 사용하는 경우 -mtune컴파일러는 이들 중 하나에서 작동하는 코드를 생성하지만 지정한 특정 CPU에서 가장 빠르게 실행되는 명령어 시퀀스를 선호합니다. 예를 들어 해당 CPU에 대해 루프 풀기 휴리스틱을 적절하게 설정합니다.


-march=foo의미 -mtune=foo당신은 또한 다른를 지정하지 않는 한 -mtune. 이것이 튜닝에 대해 아무것도하지 않고 -march옵션을 활성화하는 것보다 사용하는 것이 더 나은 이유 중 하나 -mavx입니다.

주의 사항 : -march=nativeGCC가 특별히 인식하지 않는 CPU에서는 GCC가 감지 할 수있는 새 명령 세트를 활성화하지만 -mtune=generic. 좋은 코드를 만들려면 CPU에 대해 알고있는 충분히 새로운 GCC를 사용하십시오.


답변

이것이 내가 검색 한 것입니다.

-march=X옵션은 CPU 이름을 취하고 XGCC가의 모든 기능을 사용하는 코드를 생성 할 수 있도록 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. genericGCC는 현재 CPU에서 가장 잘 실행되는 코드를 생성합니다 ( genericGCC의 한 버전에서 다른 버전으로 의 변경을 의미 함 ). 젠투 포럼에 소문이있다 -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빌드하는 동일한 머신에서만 실행하려는 경우.


답변