2011-03-29 10 views
126

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?¿Cómo ver qué banderas -march = native se activarán?

Respuesta

119

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

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

La opción -v también puede ser de utilidad.

Puede ver la documentación en la opción --helphere.

+8

Voy a sugerir que esto no es óptimo. La salida de --help = target no muestra información de la memoria caché de la CPU, de la cual se han enumerado los métodos tanto elias como 42n4 a continuación. Específicamente, en gcc 4.9.2 en un Phenom, la salida incluye estos: '' --param l1-cache-size = 64 --param l1-cache-line-size = 64 --param l2-cache-size = 512 ' –

+0

@DanielSantos: en mi sistema muestra esos parámetros con la opción' -v', aunque como parte de la línea de comando 'cc1' ... – thkala

+0

no es perfecto. en la versión 5.4.0 de gcc (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) se producirá el error a cambio: Mensajes del ensamblador: Error: de la arquitectura desconocida native Error: opción no reconocida -march = native. Por lo tanto, suelte el '-march = native' y funcionará en todos lados simplemente siguiendo:' gcc -Q --help = target'. –

61

Para ver opciones de línea de comandos, utilice:

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

Si desea ver el compilador/precompilador define fijado por ciertos parámetros, haga lo siguiente:

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

Esta respuesta merece tantos votaciones ascendentes como la aceptada para, en particular, enumerar lo que 'native' realmente equivale. –

+0

así que si me gustaría cruzar-compilación nativa, ¿debería alimentar tanto el compilador como las definiciones Y los argumentos? o son los argumentos suficientes? – hanshenrik

14

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

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

para mostrar el "rea l "banderas nativas para gcc.

Usted puede hacer que parezcan más "claridad" con un comando:

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

y usted puede deshacerse de banderas con -mno- * con:

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

Si usted quiere encontrar cómo configurar un compilador cruzado no nativo, he encontrado este útil:

en el equipo de destino,

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

A continuación, utilice esto en la máquina de construcción:

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

Desafortunadamente, esto no incluirá todas las banderas. –

+0

@BaptisteWicht ¿hay indicadores que -march = native incluirán que -march = core-avx-i no, en este caso, o qué flags? ¡Gracias! – rogerdpack

+2

@rogerdpack En esta computadora (sandybridge), march = sandybridge no habilita AVX (no sé por qué) while march = native does. Otra diferencia importante es que los tamaños de caché solo se extraen con march = native –

7

voy a tirar mis dos centavos en esta cuestión y sugerir una extensión de poco más detallado de la respuesta de Elías. 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 indicadores superfluos -mno-*. A continuación se elimina los siguientes:

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

Sin embargo, sólo he verificado la exactitud de esta en dos CPUs diferentes (un Core2 de Intel y AMD Phenom), por lo que sugiero también ejecuta el siguiente script para asegurarse de que todos estos indicadores -mno-* se pueden eliminar de 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/nullgcc -march=native -### -E - < /dev/null y aparte de algunos parámetros que se cita - y los parámetros que no contienen caracteres especiales, así que no estoy seguro de en qué circunstancias esto hace una diferencia real.

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

+0

Bueno, esto tiene los tamaños de caché también – rogerdpack

+0

gcc versión 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) devuelve: Error: arquitectura desconocida 'nativa ' –

+0

Oleg: ¿Qué arco estás usando? Podría ser que "nativo" solo sea compatible con algunas arquitecturas. –

Cuestiones relacionadas