web-dev-qa-db-fra.com

drapeaux d'optimisation gcc pour Xeon?

Je voudrais votre entrée quels drapeaux du compilateur gcc utiliser lors de l'optimisation pour les Xeons?

Il n'y a pas de "xeon" dans mtune ou mars, alors quel est le match le plus proche?

35
Eugene Bujak

Xeon est un terme marketing, en tant que tel, il couvre une longue liste de processeurs avec des internes très différents.

Si vous vouliez parler des nouveaux processeurs Nehalem (Core i7), alors cette diapositive indique qu'à partir de 4.3.1 gcc devrait être utilisé -march = generic (bien que votre propre test de votre propre application puisse trouver d'autres paramètres qui surperformer cela). La série 4.3 a également ajouté -msse4.2 si vous souhaitez optimiser cet aspect des mathématiques FP.

Voici ne discussion comparant le réglage du compilateur d'Intel à certains drapeaux gcc.

7
ShuggyCoUk

Une mise à jour pour GCC/Xeon récent.

  • basé sur Sandy-Bridge Xeon (série E3-12xx, série E5-14xx/24xx, E5-16xx/26xx/Série 46xx).

    -march=corei7-avx pour GCC <4.9.0 ou -march=sandybridge pour GCC> = 4.9.0.

    Cela active les jeux d'instructions Advanced Vector Extensions ainsi que AES et PCLMUL pour Sandy Bridge. Voici l'aperçu de la page d'options GCC i386/x86_64:

    Processeur Intel Core i7 avec extensions 64 bits, prise en charge du jeu d'instructions MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES et PCLMUL.

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

    -march=core-avx-i pour GCC <4.9.0 ou -march=ivybridge pour GCC> = 4.9.0.

    Cela inclut les options Sandy Bridge (corei7-avx) tout en plaquant également à l'appui des nouveaux jeux d'instructions Ivy: FSGSBASE, RDRND et F16C . Depuis la page des options de GCC:

    Processeur Intel Core avec extensions 64 bits, prise en charge du jeu d'instructions MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES, PCLMUL, FSGSBASE, RDRND et F16C6.

  • basé sur Haswell Xeon (série E3-1xxx v3, série E5-1xxx v3, série E5-2xxx v3 ).

    -march=core-avx2 pour GCC 4.8.2/4.8.3 ou -march=haswell pour GCC> = 4.9.0.

    Depuis la page des options de GCC:

    Processeur Intel Haswell avec extensions 64 bits, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2 et F16C prise en charge du jeu d'instructions.

  • basé sur Broadwell Xeon (série E3-12xx v4, série E5-16xx v4)

    -march=core-avx2 pour GCC 4.8.x ou -march=broadwell pour GCC> = 4.9.0.

    Depuis la page des options de GCC:

    Processeur Intel Broadwell avec extensions 64 bits, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C , Prise en charge des jeux d'instructions RDSEED, ADCX et PREFETCHW.

  • basé sur Skylake Xeon (série E3-12xx v5) et Basé sur KabyLake Xeon (série E3-12xx v6):

    -march=core-avx2 pour GCC 4.8.x ou -march=skylake pour GCC 4.9.x ou -march=skylake-avx512 pour GCC> = 5.x

    AVX-512 sont des extensions 512 bits des instructions SIMD Advanced Vector Extensions 256 bits.

    Depuis la page des options de GCC:

    Processeur Intel Skylake Server avec extensions 64 bits, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, Prise en charge du jeu d'instructions BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ et AVX512CD.

Pour savoir ce que le compilateur fera avec le -march=native option que vous pouvez utiliser:

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

les versions plus récentes de gcc ont - - march = native qui permet au compilateur de déterminer automatiquement le drapeau -march optimal.

20
user83255

march = native est correct pour votre propre machine mais mauvais pour les versions binaires.

-march = nocona est suggéré pour atom 330 (p4/64bit) -march = core2 est pour core2

Je suppose que vous utilisez 64 bits.

3
Brian

Ce qui suit vous montrera tous les indicateurs pris en charge par votre processeur:

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

La meilleure façon de déterminer quelles optimisations existent pour votre processeur dépend spécifiquement non seulement du modèle, mais aussi de la version de gcc que vous avez sur le système que vous compilez. Assurez-vous de vérifier la version de gcc que vous avez et de renvoyer à leur documentation:

https://gcc.gnu.org/onlinedocs

c'est-à-dire que j'ai Slackware 14.1 x64, qui a gcc 4.8.2, donc j'irais ici:

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

3
slugman

Mon expérience avec les processeurs Intel et x86_64 a été que chaque fois que j'essayais de dire à gcc d'optimiser pour un type de processeur spécifique, les performances devenaient moins bonnes qu'avec -march = générique, pas mieux. YMMV, bien sûr, mais j'ai joué avec des trucs comme ça beaucoup de fois au fil des ans, et ça a toujours été comme ça.

OTOH, sur i386, il peut être judicieux de cibler au moins i686 ou, si vous voulez SSE math, au moins Pentium 4.

2
Ringding