Je compile mon application C++ avec GCC 4.3. Au lieu de sélectionner manuellement les indicateurs d'optimisation, j'utilise -march=native
, qui devrait théoriquement ajouter tous les indicateurs d'optimisation applicables au matériel sur lequel je compile. Mais comment vérifier quels drapeaux utilise-t-il réellement?
Vous pouvez utiliser le -Q --help=target
Les options:
gcc -march=native -Q --help=target ...
Le -v
option peut également être utile.
Vous pouvez voir la documentation sur le --help
option ici .
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
CA devrait etre (-###
est similaire à -v
):
echo | gcc -### -E - -march=native
Montrer les "vrais" drapeaux 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'
Si vous voulez savoir comment configurer une compilation croisée non native, j'ai trouvé ceci utile:
Sur la machine cible,
% gcc -march=native -Q --help=target | grep march
-march= core-avx-i
Ensuite, utilisez ceci sur la machine de compilation:
% gcc -march=core-avx-i ...
Je vais jeter mes deux cents dans cette question et suggérer une extension légèrement plus verbeuse de la réponse de elias. À partir de la version 4.6 de gcc, l'exécution de gcc -march=native -v -E - < /dev/null
_ émet une quantité croissante de spam sous forme de superflu -mno-*
drapeaux. Ce qui suit va dépouiller ces:
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é que son exactitude sur deux processeurs différents (un processeur Intel Core2 et AMD Phenom). Je suggère donc d’exécuter également le script suivant pour vérifier que tous ces -mno-*
les drapeaux peuvent être enlevé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/null
et gcc -march=native -### -E - < /dev/null
autres que certains paramètres cités - et des paramètres ne contenant aucun caractère spécial, je ne sais donc pas dans quelles circonstances cela fait une réelle différence.
Enfin, notez que --march=native
a été introduit dans la version 4.2 de gcc, avant laquelle il ne s'agissait que d'un argument non reconnu.
J'ai écrit un script qui produira une liste de drapeaux prête à être réintroduite dans gcc
à partir de la sortie de gcc -march=native -mtune=native -Q --help=target
. C'est un peu rude, pas efficace, mais ça semble faire l'affaire.
Je suis au courant d’une mise en garde: des options avec un signe égal (=
) et aucune valeur n'est supprimée, intentionnellement.
gcc -march=native -mtune=native -Q --help=target -v 2>&1 \
| grep -h "The following options" -A200 -B0 \
| tail -n +2 \
| grep -h "Known assembler" -A0 -B999 \
| head -n -2 \
| grep -v "disabled" \
| sed -r 's/\[(enabled|default)\]//g'\
| sed -r 's/\s*//g' \
| sed -r 's/\=$//g' \
| sed -r 's/<.*>//g' \
| xargs
Vous pouvez supprimer le xargs
à la fin pour voir les drapeaux ligne par ligne.
Edit: Y compris un exemple de sortie. Sur ma machine (processeur Intel Core i5-4300U à 1,90 GHz), cela me donne:
-m128bit-long-double -m64 -m80387 -mabi=sysv -mabm -maddress-mode=long -maes -malign-data=compat -malign-functions=0 -malign-jumps=0 -malign-loops=0 -malign-stringops -march=haswell -masm=att -mavx -mavx2 -mbmi -mbmi2 -mbranch-cost=3 -mcmodel -mcpu -mcx16 -mf16c -mfancy-math-387 -mfma -mfp-ret-in-387 -mfpmath=sse -mfsgsbase -mfunction-return=keep -mfused-madd -mfxsr -mglibc -mhard-float -mhle -mieee-fp
-mincoming-stack-boundary=0 -mindirect-branch=keep -mintel-syntax -mlarge-data-threshold=65536 -mlong-double-80 -mlzcnt -mmemcpy-strategy -mmemset-strategy -mmmx -mmovbe -mpclmul -mpopcnt -mprefer-avx128 -mprefer-vector-width=none -mpreferred-stack-boundary=0 -mpush-args -mrdrnd -mrecip -mred-zone -mregparm=6 -msahf -msse -msse2 -msse3 -msse4 -msse4.1 -msse4.2 -msse5 -mssse3 -mstack-protector-guard-offset -mstack-protector-guard-reg -mstack-protector-guard-symbol -mstack-protector-guard=tls -mstringop-strategy -mstv
-mtls-dialect=gnu -mtls-direct-seg-refs -mtune-ctrl -mtune=haswell -mveclibabi -mvzeroupper -mxsave -mxsaveopt