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?

Author: vartec, 2011-03-29

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.

 160
Author: thkala,
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
 123
Author: elias,
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'
 27
Author: 42n4,
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 ...
 10
Author: Mark Lakata,
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.

 8
Author: Daniel Santos,
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