gcc g++ compiler-optimization compiler-flags

gcc - ¿Cómo ver qué banderas-march=native se activarán?



g++ optimization levels (5)

Debería ser ( -### es similar a -v ):

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

Para mostrar las banderas nativas "reales" para gcc.

Puede hacer que aparezcan más "claramente" con un comando:

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

y puedes deshacerte de banderas con -mno- * con:

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

Estoy compilando mi aplicación C ++ usando GCC 4.3. En lugar de seleccionar manualmente los indicadores de optimización, estoy usando -march=native , que en teoría debería agregar todos los indicadores de optimización aplicables al hardware en el que estoy compilando. ¿Pero cómo puedo verificar qué banderas está usando en realidad?


Para ver indicadores de línea de comandos, use:

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

Si desea ver que el compilador / precompilador define establecido por ciertos parámetros, haga esto:

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


Puede usar las opciones -Q --help=target :

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

La opción -v también puede ser útil.

Puede ver la documentación en la opción --help here .


Si desea averiguar cómo configurar una compilación cruzada no nativa, me pareció útil:

En la máquina de destino,

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

Luego, usa esto en la máquina de compilación:

% gcc -march=core-avx-i ...


Voy a poner mis dos centavos en esta pregunta y sugerir una extensión ligeramente más detallada de la respuesta de elias. A partir de gcc 4.6, la ejecución de gcc -march=native -v -E - < /dev/null emite una cantidad creciente de spam en forma de superfluo -mno-* flags. Lo siguiente les quitará estos:

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

Sin embargo, solo he verificado la exactitud de esto en dos CPU diferentes (una Intel Core2 y AMD Phenom), por lo que sugiero también ejecutar la siguiente secuencia de comandos para asegurarse de que todos estos -mno-* flags se puedan -mno-* forma segura.

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

No he encontrado una diferencia entre gcc -march=native -v -E - < /dev/null y gcc -march=native -### -E - < /dev/null no sean algunos parámetros que se citan - y parámetros que no contienen caracteres especiales, por lo que no estoy seguro de en qué circunstancias esto hace una diferencia real.

Finalmente, tenga en cuenta que --march=native se introdujo en gcc 4.2, antes de lo cual es solo un argumento no reconocido.