skylake optimization gcc compiler-construction options flags

optimization - skylake - GCC: ¿cómo es marzo diferente de mtune?



cflags gentoo (2)

Traté de limpiar la página man de GCC para esto, pero todavía no lo entiendo, realmente.

¿Cuál es la diferencia entre -march y -mtune ?

¿Cuándo se usa solo -march , vs. both? ¿Alguna vez es posible simplemente -mtune ?


Esto es lo que he buscado en Google:

La opción -march=X toma un nombre de CPU X y permite a GCC generar código que usa todas las características de X El manual de GCC explica exactamente qué nombres de CPU significan qué familias de CPU y características.

Debido a que las características generalmente se agregan, pero no se eliminan, un binario creado con -march=X se ejecutará en la CPU X , tiene una buena probabilidad de ejecutarse en CPU más nuevas que X , pero casi con seguridad no se ejecutará en algo más antiguo que X Ciertos conjuntos de instrucciones (¡3DNow !, ¿supongo?) Pueden ser específicos para un proveedor de CPU en particular, haciendo uso de estos probablemente obtendrá binarios que no se ejecutan en CPU competidoras, más nuevas o de otra manera.

La opción -mtune=Y sintoniza el código generado para que se ejecute más rápido en Y que en otras CPU en las que podría ejecutarse. -march=X implica -mtune=X -mtune=Y no anulará -march=X , así que, por ejemplo, probablemente no tenga sentido para -march=core2 y -mtune=i686 - su código no se ejecutará en nada más antiguo que core2 todos modos, debido a -march=core2 , entonces ¿por qué querría optimizar para algo más antiguo (menos funcional) que core2? -march=core2 -mtune=haswell tiene más sentido: no use ninguna función más allá de lo que proporciona core2 (¡que todavía es mucho más de lo que -march=i686 le da!), pero optimice el código para las CPU haswell mucho más nuevas, no para core2 .

También hay -mtune=generic . generic hace que GCC produzca código que funcione mejor con las CPU actuales (es decir, cambios generic de una versión de GCC a otra). Hay rumores en los foros de Gentoo de que -march=X -mtune=generic produce código que se ejecuta más rápido en X que el código producido por -march=X -mtune=X does (o simplemente -march=X , como -mtune=X está implícito ) No tengo idea de si esto es cierto o no.

En general, a menos que sepa exactamente lo que necesita, parece que el mejor curso es especificar -march=<oldest CPU you want to run on> y -mtune=generic ( -mtune=generic está aquí para contrarrestar la implícita -mtune=<oldest CPU you want to run on> , porque probablemente no desee optimizar la CPU más antigua). O simplemente -march=native , si alguna vez vas a ejecutar solo en la misma máquina en la que creaste.


Si usa -march entonces GCC tendrá libertad para generar instrucciones que funcionen en la CPU especificada, pero no en (típicamente) CPUs anteriores en la familia de arquitecturas. Si usa -mtune , el compilador generará código que funciona en cualquiera de ellos, pero favorecerá las secuencias de instrucciones que se ejecutan más rápido en la CPU específica que indicó.