나는 이것을 위해 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
의미한다 mtune
. 따라서 귀하의 반대에 대한 답변은 각각 아니오와 예입니다.
이것이 내가 검색 한 것입니다.
이 -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
빌드하는 동일한 머신에서만 실행하려는 경우.
-march=native
, 당신은 지정할 수 있습니다 -mtune=X
기본이 여전히 있기 때문에, -mtune=generic
여기에 설명 된대로 : lemire.me/blog/2018/07/25/...
-march=native
것을 의미 tune=native
합니다. 그 기사는 단지 나쁜 경우만을 제시합니다. 최신 GCC 버전은 특히 AVX2 및 AVX-512와 같은 새로운 명령어를 사용할 때 일반적으로 더 나은 코드를 만듭니다. 그리고 CPU를 위해 설계된 튜닝 설정 (루프 언롤 휴리스틱과 같은)을 갖는 것은 확실한 장점입니다. 이러한 옵션을 사용하는 것으로 성능에 대해 충분히 관심 그렇다면, 새로운 GCC에서 사용 적어도 당신의 CPU, 바람직하게는 현재 안정의 relese에 대해 알고 하나를.
tune=generic
동일한 마이크로 아키텍처 제품군의 새로운 구성원, 특히 Skylake 마이크로 아키텍처와 문자 그대로 동일한 Kaby Lake와 같은 것보다 더 잘할 수 없다는 것은 좋지 않습니다 . 하지만 여전히 가족 / 스테핑이 다르기 때문에 Skylake 이상 만 알고 있던 GCC는 튜닝을 위해 인식하지 못할 수 있습니다.