Comment voir quels drapeaux -march = native s'activeront?

165

Je compile mon application C ++ en utilisant GCC 4.3. Au lieu de sélectionner manuellement les indicateurs d'optimisation que j'utilise -march=native, qui en théorie devraient ajouter tous les indicateurs d'optimisation applicables au matériel sur lequel je compile. Mais comment puis-je vérifier quels indicateurs utilise-t-il réellement?

vartec
la source

Réponses:

150

Vous pouvez utiliser les -Q --help=targetoptions:

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

L' -voption peut également être utile.

Vous pouvez voir la documentation sur l' --helpoption ici .

Thkala
la source
10
Je vais suggérer que ce n'est pas optimal. La sortie de --help = target n'affiche pas les informations du cache du processeur, dont les méthodes elias et 42n4 ci-dessous ont répertoriées. Plus précisément, sur gcc 4.9.2 sur un Phenom, la sortie comprend les éléments suivants:--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512
Daniel Santos
@DanielSantos: sur mon système, il affiche ces paramètres avec l' -voption, bien que dans le cadre de la cc1ligne de commande ...
thkala
pas parfait. sur gcc version 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) cela provoquera l'erreur en retour: Messages de l'assembleur: Erreur: architecture inconnue native Erreur: option non reconnue -march = native. Donc, perdre la -march=nativeet il fonctionnera partout juste après: gcc -Q --help=target.
Oleg Kokorin le
@Oleg - Cela ressemble à un bogue dans GCC 5. Le problème n'est pas présent dans GCC 7.
jww
111

Pour voir les indicateurs de ligne de commande, utilisez:

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

Si vous voulez voir les définitions du compilateur / précompilateur définies par certains paramètres, procédez comme suit:

echo | gcc -dM -E - -march=native
Elias
la source
1
Cette réponse mérite autant de votes positifs que celle acceptée pour, en particulier, énumérer ce à quoi nativecorrespond vraiment.
Iwillnotexist Idonotexist
4
Donc, si je souhaite effectuer une compilation croisée native, je dois alimenter à la fois le compilateur avec les définitions ET les arguments? ou les arguments sont-ils suffisants?
hanshenrik
25

Il devrait être ( -###est similaire à -v):

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

Pour afficher les "vrais" indicateurs natifs pour gcc.

Vous pouvez les faire apparaître plus "clairement" avec une commande:

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

et vous pouvez vous débarrasser des drapeaux avec -mno- * avec:

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

Si vous voulez savoir comment configurer une compilation croisée non native, j'ai trouvé cela utile:

Sur la machine cible,

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

Ensuite, utilisez ceci sur la machine de construction:

% gcc -march=core-avx-i ...
Mark Lakata
la source
Cela n'inclura malheureusement pas tous les drapeaux.
Baptiste Wicht
@BaptisteWicht y a-t-il des indicateurs que -march = native inclura que -march = core-avx-i ne le ferait pas, dans ce cas, ou quels indicateurs? Merci!
rogerdpack
2
@rogerdpack Sur cet ordinateur (sandybridge), march = sandybridge n'active pas AVX (je ne sais pas pourquoi) alors que march = native le fait. Une autre différence importante est que les tailles de cache ne sont extraites qu'avec march = native
Baptiste Wicht
1
@BaptisteWicht c'est bizarre semble fonctionner ici (je suppose): echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1mais les tailles de cache semblent absentes.
rogerdpack
7

Je vais jeter mes deux cents dans cette question et suggérer une extension un peu plus verbeuse de la réponse d'Elias. Depuis gcc 4.6, l'exécution de gcc -march=native -v -E - < /dev/nullémet une quantité croissante de spam sous forme d' -mno-*indicateurs superflus . Ce qui suit va les dépouiller:

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

Cependant, je n'ai vérifié l'exactitude de cela que sur deux processeurs différents (un Intel Core2 et AMD Phenom), donc je suggère également d'exécuter le script suivant pour être sûr que tous ces -mno-*indicateurs peuvent être supprimés en toute sécurité.

#!/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}.$$

Je n'ai pas trouvé de différence entre gcc -march=native -v -E - < /dev/nullet gcc -march=native -### -E - < /dev/nullautres que certains paramètres cités - et des paramètres qui ne contiennent pas de caractères spéciaux, donc je ne suis pas sûr dans quelles circonstances cela fait une réelle différence.

Enfin, notez que cela a --march=nativeété introduit dans gcc 4.2, avant lequel il ne s'agit que d'un argument non reconnu.

Daniel Santos
la source
Bien, ce gleans a également les tailles de cache
rogerdpack
gcc version 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) renvoie: Erreur: architecture inconnue `native '
Oleg Kokorin
Oleg: Quelle arche utilisez-vous? Il se peut que "native" ne soit supportée que sur certaines architectures.
Daniel Santos