optimization - safe - gentoo skylake
Indicadores de optimización de GCC para Intel Atom (10)
¿Qué pasa con el compilador Intel C (icc)? Al menos en los puntos de referencia que vienen con él, la dominación sobre gcc es bastante notable ...
Estoy desarrollando una aplicación de rendimiento crítico para el procesador Intel Atom.
¿Cuáles son los mejores indicadores de optimización de gcc para esta CPU?
Al igual que para Pentium 4:
-march=prescott -O2 -pipe -fomit-frame-pointer
Bueno, el wiki de Gentoo indica para el prescott:
http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel#Atom_N270
CHOST = "i686-pc-linux-gnu"
CFLAGS = "- march = prescott -O2 -pipe -fomit-frame-puntero"
CXXFLAGS = "$ {CFLAGS}"
De Intel, Comenzando con MID
Cuando se usa GCC para compilar, hay algunos indicadores recomendados para usar:
- -O2 o -O1: indicador O2 optimiza la velocidad, mientras que el indicador -O1 optimiza para tamaño
- -msse3
- -march = core2
- -mfpmath = sse
GCC 4.5 contendrá las opciones -march = atom y -mtune = atom.
Hay un marco genial llamado Acovea (Análisis de las Opciones del Compilador a través del Algoritmo Evolutivo) , de Scott Rober Ladd, uno de los hackers de GCC. Es un marco de algoritmo genético / evolutivo que trata de optimizar los indicadores de optimización de GCC para una pieza específica de código a través de la selección natural.
Funciona de la siguiente manera: escribes un pequeño fragmento de código de referencia ( realmente tiene que ser pequeño, porque se volverá a compilar y ejecutar miles de veces) que representa las características de rendimiento del programa más grande que deseas optimizar. Entonces, Acovea construye al azar algunas docenas de líneas de comando de GCC diferentes y compila y ejecuta su punto de referencia con cada uno de ellos. Lo mejor de estas líneas de comando se les permite "aparearse" y "criar" nuevos "hijos" que (con suerte) heredan los mejores "genes" de sus "padres". Este proceso se repite por un par de docenas de "generaciones", hasta que emerge un conjunto estable de banderas de línea de comando.
No sé si GCC todavía tiene indicadores de optimización específicos de Atom, pero se supone que el núcleo Atom es muy similar al Pentium original, con la suma muy significativa de los conjuntos de instrucciones MMX / SSE / SSE2 / SSE3 / SSSE3. Por supuesto, estos solo hacen una diferencia significativa si su código es de coma flotante o pesados en DSP.
Tal vez podrías intentar:
gcc -O2 -march = pentium -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath = sse
Tengo un script que selecciona automáticamente los indicadores apropiados para la combinación de tu CPU y compilador. Acabo de actualizarlo para que sea compatible con Intel Atom:
http://www.pixelbeat.org/scripts/gcccpuopt
Actualización: anteriormente especifiqué -march = prescott para Atom, pero al mirar más en él se muestra que Atom cumple con ISA Merom, por lo tanto, -march = core2 es más apropiado. Sin embargo, tenga en cuenta que los átomos son núcleos en orden, el último de los cuales es el pentium original. Por lo tanto, es probable que sea mejor -mtune = pentium también. Desafortunadamente no tengo un Atom para probar. Realmente apreciaría si alguien pudiera comparar la diferencia entre:
-march=core2 -mfpmath=sse -O3
-march=core2 -mtune=pentium -mfpmath=sse -O3
Actualización: Aquí hay un par de buenos artículos sobre la optimización de bajo nivel para Atom:
aquí hay algunos polinización cruzada de blogs ... lo que realmente esperaba era un punto de referencia de Firefox compilado por átomo ...
Dirección: http: // ivoras.sharanet.org/blog/tree/2009-02-11.optimizing-for-atom.html
"Al parecer, gcc parece hacer un trabajo muy decente con -mtune = native, y mtune = generic es más que aceptable. Las mayores ganancias (en este punto de referencia matemático pesado) provienen del uso de SSE para matemáticas, pero incluso ellos se destruyen mediante la afinación de pentium4.
"La diferencia entre la optimización más rápida y la más lenta es del 21%. El impacto de usar march en lugar de mtune es insignificante (no hay diferencia suficiente para saber si ayuda o no).
"(He incluido k6 solo como referencia, sé que Atom no tiene 3dnow)
"Actualización tardía: el ajuste para k8 (con SSE y O3) arroja un mejor puntaje ligeramente superior de 182".
i686 es el más cercano. No vaya por core2.
GCC 4.1 -O3 -march = i686 GCC 4.3 -O3 -march = native
GCC 4.1 -O4 -ffast-math GCC 4.3 -O4 -ffast-math
http://macles.blogspot.com/2008/09/intel-cc-compiler-gcc-and-intel-atom.html