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

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



답변

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

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

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

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


답변

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

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

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

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


답변

다음 -###과 같아야합니다 -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'


답변

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

대상 머신에서

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

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

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


답변

나는이 질문에 내 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에서 소개되었는데, 그 전에는 인식 할 수없는 주장 일뿐입니다.


답변