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.