어떤 플래그 -march = native가 활성화되는지 확인하는 방법


165

GCC 4.3을 사용하여 C ++ 앱을 컴파일하고 있습니다. -march=native이론적으로 내가 컴파일하고있는 하드웨어에 적용 가능한 모든 최적화 플래그를 추가 해야하는 최적화 플래그를 수동으로 선택하는 대신 . 그러나 실제로 사용중인 플래그를 어떻게 확인할 수 있습니까?

답변:


150

-Q --help=target옵션을 사용할 수 있습니다 :

gcc -march=native -Q --help=target ...

-v옵션은 사용 일 수있다.

여기서--help 옵션 에 대한 설명서를 볼 수 있습니다 .


10
나는 이것이 차선책이라고 제안하려고한다. --help = target의 출력은 CPU 캐시 정보를 표시하지 않습니다. 아래의 elias 및 42n4 메소드가 모두 나열되어 있습니다. 특히 페놈의 gcc 4.9.2에서 출력은 다음과 같습니다.--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512
Daniel Santos

@DanielSantos : 내 시스템 -v에서는 cc1명령 행의 일부이지만 옵션 과 함께 해당 매개 변수를 표시 합니다.
thkala

완벽하지 않다. gcc 버전 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty)에서 다음 오류가 발생합니다. 어셈블러 메시지 : 오류 : 알 수없는 아키텍처 기본 오류 : 인식 할 수없는 옵션 -march = native. 그래서, 느슨한 -march=native하고 그냥 다음 모든 곳에서 작동합니다 gcc -Q --help=target.
Oleg Kokorin

@Oleg-GCC 5의 버그 인 것 같습니다.이 문제는 GCC 7에는 없습니다.
jww

111

명령 행 플래그를 보려면 다음을 사용하십시오.

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1

컴파일러 / 프리 컴파일러가 특정 매개 변수로 설정 한 정의를 보려면 다음을 수행하십시오.

echo | gcc -dM -E - -march=native

1
이 답변은 특히 native실제로 무엇을 나열하는지에 대해 인정 된 것만 큼 많은 투표를 할 가치가 있습니다.
Iwillnotexist Idonotexist

4
그래서 크로스 네이티브 컴파일을 원한다면 컴파일러에게 정의와 인수를 모두 공급해야합니까? 아니면 논쟁이 충분합니까?
hanshenrik '12

25

다음 -###과 같아야합니다 -v.

echo | gcc -### -E - -march=native 

gcc에 대한 "실제"기본 플래그를 표시합니다.

다음 명령을 사용하여 더 명확하게 표시 할 수 있습니다.

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )//g'

다음과 같이 -mno- *를 사용하여 플래그를 제거 할 수 있습니다.

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )|( -mno-[^\ ]+)//g'

10

비원시 크로스 컴파일을 설정하는 방법을 찾으려면이 유용하다는 것을 알았습니다.

대상 머신에서

% gcc -march=native -Q --help=target | grep march
-march=                               core-avx-i

그런 다음 빌드 머신에서 이것을 사용하십시오.

% gcc -march=core-avx-i ...

불행히도 모든 플래그가 포함되지는 않습니다.
Baptiste Wicht

@BaptisteWicht -march = native에 -march = core-avx-i가이 플래그를 포함하지 않는 플래그 또는 어떤 플래그가 포함됩니까? 감사!
rogerdpack

2
@rogerdpack이 컴퓨터 (sandybridge)에서 march = sandybridge는 AVX를 활성화하지 않지만 (이유는 모르지만) march = native는 작동합니다. 또 다른 중요한 차이점은 캐시 크기가 march = native로만 추출된다는 것입니다.
Baptiste Wicht

1
@BaptisteWicht는 이상하게 작동하는 것 같습니다 ( echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1물론 ) : 캐시 크기는없는 것 같습니다.
rogerdpack

7

나는이 질문에 내 2 센트를 던져서 elias의 대답을 조금 더 장황하게 확장 할 것을 제안 할 것입니다. gcc 4.6부터는 실행시 gcc -march=native -v -E - < /dev/null불필요한 -mno-*플래그 형태로 스팸이 증가 합니다. 다음은 이것을 제거합니다.

gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'

그러나 두 개의 다른 CPU (Intel Core2 및 AMD Phenom)에서만이 정확성을 확인 했으므로 다음 -mno-*플래그 를 실행하여 이러한 플래그를 모두 안전하게 제거 할 수 있습니다.

#!/bin/bash

gcc_cmd="gcc"

# Optionally supply path to gcc as first argument
if (($#)); then
    gcc_cmd="$1"
fi

with_mno=$(
    "${gcc_cmd}" -march=native -mtune=native -v -E - < /dev/null 2>&1 |
    grep cc1 |
    perl -pe 's/^.* - //g;'
)
without_mno=$(echo "${with_mno}" | perl -pe 's/ -mno-\S+//g;')

"${gcc_cmd}" ${with_mno}    -dM -E - < /dev/null > /tmp/gcctest.a.$$
"${gcc_cmd}" ${without_mno} -dM -E - < /dev/null > /tmp/gcctest.b.$$

if diff -u /tmp/gcctest.{a,b}.$$; then
    echo "Safe to strip -mno-* options."
else
    echo
    echo "WARNING! Some -mno-* options are needed!"
    exit 1
fi

rm /tmp/gcctest.{a,b}.$$

인용 된 일부 매개 변수와 특수 문자가 포함되지 않은 매개 변수 gcc -march=native -v -E - < /dev/null와 의 차이점을 찾지 gcc -march=native -### -E - < /dev/null못했습니다. 어떤 상황에서 이것이 실제로 차이를 일으키는 지 확실하지 않습니다.

마지막으로 --march=nativegcc 4.2에서 소개되었는데, 그 전에는 인식 할 수없는 주장 일뿐입니다.



GCC 버전 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50 더러운) 반환 : 오류 : 알 수없는 아키텍처 '기본'
올렉 코코 린

올렉 : 어떤 아치를 사용하고 있습니까? "네이티브"는 일부 아키텍처에서만 지원 될 수 있습니다.
Daniel Santos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.