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?

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 .


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

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'

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 ...

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.