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
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 --help
here.
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
Esta respuesta merece tantos votaciones ascendentes como la aceptada para, en particular, enumerar lo que 'native' realmente equivale. –
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
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'
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 ...
Desafortunadamente, esto no incluirá todas las banderas. –
@BaptisteWicht ¿hay indicadores que -march = native incluirán que -march = core-avx-i no, en este caso, o qué flags? ¡Gracias! – rogerdpack
@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 –
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/null
gcc -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.
Bueno, esto tiene los tamaños de caché también – rogerdpack
gcc versión 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) devuelve: Error: arquitectura desconocida 'nativa ' –
Oleg: ¿Qué arco estás usando? Podría ser que "nativo" solo sea compatible con algunas arquitecturas. –
- 1. ¿Qué hace exactamente -march = native?
- 2. ¿Cómo hacer que gcc use march = native como predeterminado?
- 3. banderas de optimización gcc para Xeon?
- 4. Averigüe qué banderas estamos construyendo en Setup.hs
- 5. No se encontró implementación para native
- 6. Banderas de impresión Enum como banderas separadas
- 7. ¿qué constructor se llamará para ver?
- 8. Banderas de bits: ¿Qué me estoy perdiendo?
- 9. Banderas, enumeración (C)
- 10. PostgreSQL cómo ver qué consultas se han ejecutado
- 11. cómo ver qué código javascript se está ejecutando actualmente?
- 12. ¿Cómo puedo ver qué archivos se cambiaron entre 2 revisiones?
- 13. Titanium vs The Native Tools
- 14. Banderas C# Enum comparación
- 15. ¿Cómo funcionan las banderas en C?
- 16. ¿Por qué no funciona esta implementación de Jarvis 'March ("Algoritmo de envoltura de regalos")?
- 17. Banderas de funciones de PHP, ¿cómo?
- 18. ¿Cómo comparar las banderas en C#?
- 19. ¿Qué significa la palabra clave 'native' en JavaScript?
- 20. Cómo ver una DataTable mientras se depura
- 21. Cambiar las banderas RegExp
- 22. Apache Tomcat Native library no se encontró en java.library.path?
- 23. banderas enumeración en JavaScript
- 24. ¿Cómo usar banderas binarias en Core Data?
- 25. jquery each vs. native para
- 26. ¿Cómo se sobrescriben las banderas de compilación predeterminadas para Cython cuando se compila con distutils?
- 27. ¿Cómo puedo ver qué teclas cree vim?
- 28. Adición Banderas Linker en Xcode
- 29. banderas con los servicios web
- 30. NodeJS y node-mongodb-native
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 ' –
@DanielSantos: en mi sistema muestra esos parámetros con la opción' -v', aunque como parte de la línea de comando 'cc1' ... – thkala
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'. –