Voy a poner mis dos centavos en esta pregunta y sugerir una extensión un poco 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 cada vez mayor de correo no deseado en forma de -mno-*
indicadores superfluos . Lo siguiente los quitará:
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 corrección de esto en dos CPU diferentes (un Intel Core2 y AMD Phenom), por lo que sugiero también ejecutar el siguiente script para asegurarme de que todos estos -mno-*
indicadores se puedan quitar 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
y gcc -march=native -### -E - < /dev/null
aparte de 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.
--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512