Jak sprawdzić, które flagi-march=native aktywują się?
Kompiluję moją aplikację C++ używając GCC 4.3. Zamiast ręcznie wybierać flagi optymalizacji używam -march=native
, która teoretycznie powinna dodać wszystkie flagi optymalizacji mające zastosowanie do sprzętu, na którym kompiluję. Ale jak mogę sprawdzić, których FLAG faktycznie używa?
5 answers
Możesz użyć opcji -Q --help=target
:
gcc -march=native -Q --help=target ...
Opcja -v
może być również przydatna.
Możesz zobaczyć dokumentację w opcji --help
tutaj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 09:29:52
Aby zobaczyć flagi linii poleceń, użyj:
gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
Jeśli chcesz zobaczyć, jak kompilator / precompiler definiuje określone parametry, wykonaj następujące czynności:
echo | gcc -dM -E - -march=native
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 22:28:03
Powinno być (-###
jest podobne do -v
):
echo | gcc -### -E - -march=native
Aby pokazać" prawdziwe " flagi natywne dla gcc.
Możesz sprawić, by wyglądały bardziej "wyraźnie" za pomocą polecenia:
gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )//g'
I możesz pozbyć się FLAG za pomocą-mno - * za pomocą:
gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )|( -mno-[^\ ]+)//g'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-14 00:39:10
Jeśli chcesz dowiedzieć się, jak skonfigurować Nie-natywną kompilację krzyżową, uznałem to za przydatne:
Na maszynie docelowej,
% gcc -march=native -Q --help=target | grep march
-march= core-avx-i
Następnie użyj tego na maszynie kompilacyjnej:
% gcc -march=core-avx-i ...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-13 20:21:14
Wrzucę moje dwa grosze do tego pytania i zaproponuję nieco bardziej zwięzłe rozszerzenie odpowiedzi Eliasa. Od wersji gcc 4.6 uruchamianie gcc -march=native -v -E - < /dev/null
emituje coraz większą ilość spamu w postaci zbędnych FLAG -mno-*
. Oto one:
gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'
Jednak zweryfikowałem poprawność tego tylko na dwóch różnych procesorach (Intel Core2 i AMD Phenom), więc proponuję również uruchomić następujący skrypt, aby mieć pewność, że wszystkie te flagi -mno-*
mogą być bezpiecznie rozebrana.
2021 EDIT: istnieją maszyny, w których -march=native
używa określonej wartości -march
, ale musi wyłączyć niektóre domyślne Isa (Architektura zestawów instrukcji) za pomocą -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}.$$
Nie znalazłem różnicy między gcc -march=native -v -E - < /dev/null
i gcc -march=native -### -E - < /dev/null
poza niektórymi parametrami, które są cytowane -- i parametrami, które nie zawierają znaków specjalnych, więc nie jestem pewien, w jakich okolicznościach robi to jakąś rzeczywistą różnicę.
Na koniec zauważ, że --march=native
wprowadzono w gcc 4.2, przed którym jest to po prostu nierozpoznany argument.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-09 23:51:10