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=native
gcc 4.2에서 소개되었는데, 그 전에는 인식 할 수없는 주장 일뿐입니다.