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


87

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

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

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

답변:


97

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

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


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

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


10
둘 다 사용하는 것이 타당한 지 또는 동일한 값으로 설정했을 때 mtune이 중복되는지 여부에 대해서는 대답하지 않습니다.
Pavel Šimerda

12
@ PavelŠimerda 직관적으로 대답은 두 가지 기능의 정의에 내재되어 있습니다. 게다가, 문서는 명시 적으로이 상태 march의미한다 mtune. 따라서 귀하의 반대에 대한 답변은 각각 아니오와 예입니다.
underscore_d

이렇게 우아하게 설명 해주셔서 감사합니다! 당신은 이해하기 쉽게 만듭니다.
Rahim Khoja 2016 년

5
사람들은 tl; dr이 필요합니다. 프로세서에서만 실행하는 경우 -march를 사용하고 다른 프로세서에서 안전하게 실행하려면 -mtune을 사용하십시오.
j riv

3
사용자는 또한 오래된 컴파일러 (일부 CPU가 존재하지 않기 전에 릴리스 됨)가 다른 최적 mtunemarch조합을 초래할 수 있음을 이해해야합니다 . 이 블로그 게시물은 다른 사람들과 함께 그 점을 밝힙니다
qneill

52

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

-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빌드하는 동일한 머신에서만 실행하려는 경우.


4
당신이 사용하는 경우 그러나 -march=native, 당신은 지정할 수 있습니다 -mtune=X기본이 여전히 있기 때문에, -mtune=generic여기에 설명 된대로 : lemire.me/blog/2018/07/25/...
롤랜드 웨버에게

@RolandWeber : CPU에 대해 알기에는 너무 오래된 GCC를 사용하는 경우에만 발생합니다. CPU에 대해 알고있는 GCC를 사용하면 괜찮다는 -march=native것을 의미 tune=native합니다. 그 기사는 단지 나쁜 경우만을 제시합니다. 최신 GCC 버전은 특히 AVX2 및 AVX-512와 같은 새로운 명령어를 사용할 때 일반적으로 더 나은 코드를 만듭니다. 그리고 CPU를 위해 설계된 튜닝 설정 (루프 언롤 휴리스틱과 같은)을 갖는 것은 확실한 장점입니다. 이러한 옵션을 사용하는 것으로 성능에 대해 충분히 관심 그렇다면, 새로운 GCC에서 사용 적어도 당신의 CPU, 바람직하게는 현재 안정의 relese에 대해 알고 하나를.
Peter Cordes

GCC가 tune=generic동일한 마이크로 아키텍처 제품군의 새로운 구성원, 특히 Skylake 마이크로 아키텍처와 문자 그대로 동일한 Kaby Lake와 같은 것보다 더 잘할 수 없다는 것은 좋지 않습니다 . 하지만 여전히 가족 / 스테핑이 다르기 때문에 Skylake 이상 만 알고 있던 GCC는 튜닝을 위해 인식하지 못할 수 있습니다.
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.