c++ c optimization gcc compiler-flags

c++ - Indicadores de optimización de gcc para Xeon?



optimization compiler-flags (6)

Me gustaría que tu entrada, ¿qué banderas del compilador gcc usar cuando se optimiza para Xeons?

No hay ''xeon'' en mtune o march entonces ¿cuál es la coincidencia más cercana?


A continuación, le mostrará todos los indicadores que admite su procesador:

cat /proc/cpuinfo | grep flags | head -1

La mejor forma de determinar qué optimizaciones existen para su procesador depende específicamente no solo del modelo, sino de la versión de gcc que tenga en el sistema que está compilando. Asegúrese de verificar qué versión de gcc tiene y hacer una referencia cruzada en su documentación:

https://gcc.gnu.org/onlinedocs

es decir, tengo Slackware 14.1 x64, que tiene gcc 4.8.2, así que iría aquí:

https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/i386-and-x86-64-Options.html#i386-and-x86-64-Options


Las versiones más nuevas de gcc tienen -march = native que permite al compilador determinar automáticamente el indicador de -march óptimo.


Mi experiencia con las CPUs de Intel y x86_64 ha sido que cada vez que trato de decirle a gcc que optimice para un tipo de CPU específico, el rendimiento empeora con respecto a -march = genérico, no mejor. YMMV, por supuesto, pero he estado jugando con cosas como esta muchas veces a lo largo de los años, y siempre ha sido así.

OTOH, en i386 podría tener sentido apuntar al menos a i686 o, si quieres matemáticas SSE, al menos a Pentium 4.


Una actualización para GCC / Xeon reciente.

  • Sandy-Bridge-based Xeon (series E3-12xx, series E5-14xx / 24xx, series E5-16xx / 26xx / 46xx).

    -march=corei7-avx para GCC <4.9.0 o -march=sandybridge para GCC> = 4.9.0.

    Esto permite el soporte de Extensiones de Vector Avanzado , así como los conjuntos de instrucciones AES y PCLMUL para Sandy Bridge. Aquí está la descripción general de la página de opciones de GCC i386 / x86_64:

    Intel Core i7 CPU con extensiones de 64 bits, soporte de conjunto de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES y PCLMUL.

  • Ivy-Bridge-based Xeon (E3-12xx v2-series, E5-14xx v2 / 24xx v2-series, E5-16xx v2 / 26xx v2 / 46xx v2-series, E7-28xx v2 / 48xx v2 / 88xx v2-series) .

    -march=core-avx-i para GCC <4.9.0 o -march=ivybridge para GCC> = 4.9.0.

    Esto incluye las opciones de Sandy Bridge (corei7-avx) y también ofrece soporte para los nuevos conjuntos de instrucciones de Ivy: FSGSBASE, RDRND y F16C . Desde la página de opciones de GCC:

    Intel Core CPU con extensiones de 64 bits, soporte de conjunto de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES, PCLMUL, FSGSBASE, RDRND y F16C6.

  • Xeon Haswell-based (E3-1xxx v3-series, E5-1xxx v3-series, E5-2xxx v3-series).

    -march=core-avx2 para GCC 4.8.2 / 4.8.3 o -march=haswell para GCC> = 4.9.0.

    Desde la página de opciones de GCC:

    CPU Intel Haswell con extensiones de 64 bits, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2 y F16C conjunto de instrucciones de soporte.

  • Xeon Broadwell-based (serie E3-12xx v4, serie E5-16xx v4)

    -march=core-avx2 para GCC 4.8.x o -march=broadwell para GCC> = 4.9.0.

    Desde la página de opciones de GCC:

    CPU Intel Broadwell con extensiones de 64 bits, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C , Soporte de conjunto de instrucciones RDSEED, ADCX y PREFETCHW.

  • Skylake-based Xeon (serie E3-12xx v5) y Xeon KabyLake-based KabyLake (serie E3-12xx v6):

    -march=core-avx2 para GCC 4.8.x o -march=skylake para GCC 4.9.x o -march=skylake-avx512 para GCC> = 5.x

    Desde la página de opciones de GCC:

    CPU Intel Skylake Server con extensiones de 64 bits, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, Compatibilidad con el conjunto de instrucciones BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ y AVX512CD.

Para averiguar qué hará el compilador con la opción -march=native , puede usar:

gcc -march=native -Q --help=target


Xeon es un término de marketing, ya que cubre una larga lista de procesadores con componentes internos muy diferentes.

Si se refería a los procesadores más nuevos de Nehalem (Core i7), esta diapositiva indica que a partir de 4.3.1 gcc se debe usar -march = generic (aunque su propia prueba de su propia aplicación puede encontrar otras configuraciones que superen esto). La serie 4.3 también agregó -msse4.2 si desea optimizar ese aspecto de las matemáticas FP.

Aquí hay una discusión que compara el ajuste en el compilador de Intel con algunos indicadores de gcc.


march = native está bien para su propia máquina, pero es malo para las versiones binarias.

-march = nocona se sugiere para el átomo 330 (p4 / 64bit) -march = core2 es para core2

Supongo que vas a ir a 64 bits.