Intel Fortran Compiler: conseils sur l'optimisation lors de la compilation

21

Je vais commencer par mon expérience personnelle dans notre laboratoire. Dans les ifort 9 et 10 jours, nous avions l'habitude d'être assez agressifs avec les optimisations, en compilant avec -O3 et des drapeaux spécifiques au processeur (-xW -xSSE4.2 par exemple). Mais à partir d'ifort 11, nous avons commencé à remarquer:
1. des incohérences dans les résultats (car la sémantique n'était pas préservée)
2. des gains plus faibles par rapport à -O2.

Donc actuellement, nous compilons simplement avec -O2 et -xhost. Avez-vous de meilleures suggestions avec ifort 11? Cela changera-t-il encore une fois que nous passerons à l'ifort 12? Merci d'avance.

FrançaisKheldar
la source
7
Les optimisations ne bénéficient pas uniformément à tous les codes. Ainsi, je pense qu'une meilleure question serait "Comment puis-je profiler mon code afin de savoir quelles optimisations de compilateur sont efficaces?"
Matt Knepley
1
Parce que la sémantique n'a pas été préservée, ou parce que quelque chose a été réorganisé? Cela peut être un peu errant par rapport au sujet, mais il serait bon de voir un extrait de code qui reproduit le problème. Il se peut que quelque chose ait été réorganisé d'une manière que vous n'aimez pas, mais que le compilateur pense que ça devrait aller. D'après mon expérience, Intel 12 fait un meilleur travail de vectorisation que n'importe lequel de ses prédécesseurs, je m'attends donc à plus de changements lorsque vous passerez à la dernière version.
Bill Barth
Je pensais que dire que la sémantique n'était pas préservée était équivalent à la commande n'était pas préservée. Quoi qu'il en soit, je réalise que ma question est (trop?) Générique, et je ne voulais pas m'attarder sur les détails. Nous avons eu plusieurs problèmes avec Intel 10, certains étaient des bogues du compilateur et certains restaient inexpliqués. Donc avec 11, nous avons joué en toute sécurité et nous avons été satisfaits de la performance. Mais peut-être que nous jouons trop prudemment, et je voulais savoir si la communauté avait des conseils.
FrenchKheldar

Réponses:

16

Nous recommandons fortement à tous nos utilisateurs de commencer par -O3 -xHost -ipoifort 11 et ifort 12. S'il existe des transformations à virgule flottante particulières activées par O3 qui affectent la précision de certains de vos calculs, vous pouvez les désactiver spécifiquement avec -fp-model precise -fp-model except(ou, plus radicalement, -fp-model strict) tout en conservant les autres optimisations permises par O3, telles que le blocage de boucle pour le cache, la fusion et le déroulement de boucle et les optimisations d'accès à la mémoire.

Je vous conseille d'essayer le modèle de virgule flottante sur des fichiers individuels et de découvrir où cela fait une différence, plutôt que de le désactiver globalement; cela peut être un ralentisseur de ~ 15%, et vous voulez pouvoir le garder là où cela n'affecte pas vos calculs. Si vous ne savez pas où la précision est affectée, vous pouvez jouer avec l'activation et la désactivation des indicateurs de modèle à virgule flottante pour ces fichiers, ou jouer avec les modes d'arrondi .

Nous avons récemment parlé brièvement à nos utilisateurs des indicateurs d'optimisation, en nous concentrant sur les compilateurs GNU et Intel pour x86; vous pouvez voir les diapositives de cette conférence ici .

Soit dit en passant , alors que nous parlons de choisir des indicateurs d'optimisation pour votre code, il vaut également la peine de regarder de temps en temps la sortie de -vec-report pour voir où le compilateur a tenté de vectoriser une boucle et n'a pas pu; Parfois, vous pouvez apporter de petites modifications à votre boucle, ce qui peut rendre possible la vectorisation (qui peut être une accélération 4x). De même pour le rapport plus général -opt-report .

nullglob
la source
J'aime votre réponse, mais je l'ai essayée à nouveau avec l'un de nos tests et j'ai -O3 -xhost -fp-model precise -fp-model exceptentraîné un ralentissement de 30% . Je vais regarder à nouveau le profilage et le -vec-reportpour essayer de voir ce qui se passe ...
FrenchKheldar
2
Plus de -O2 -xhost? C'est intéressant; c'est très inhabituel mais cela peut arriver. Dans des cas comme celui-ci, l'optimiseur fait quelque chose qui a de bonnes raisons de penser qu'il améliorera la vitesse, mais il s'avère que les choses empirent. Habituellement, pour le code scientifique, qui a une structure assez simple, cela ne se produit pas. Dans des cas comme celui-ci, l'optimisation guidée par profil - software.intel.com/sites/products/documentation/hpc/compilerpro/… - peut souvent aider.
5

Je travaille pour une entreprise qui produit de grandes applications hautement techniques à Fortran avec IFort - les applications sont très critiques en termes de performances, car la vitesse (tout en maintenant la précision) est le principal argument de vente.

Nous compilons toujours avec -O3, et à ma connaissance, les principales choses que -O3 fait sont le déroulement de la boucle et la prélecture. Je soupçonne que la plupart des applications de calcul scientifique en bénéficient grandement, en particulier les optimisations de boucle. Nous n'avons pas vu d'erreurs de compilation depuis un certain temps (bien que nous ayons vu quelques erreurs de l'éditeur de liens lors de l'utilisation d'Ifort sur un Mac). Nous utilisons 11.1.095.

J'espère que ça aide.

OscarB
la source
4

Je me rends compte que cette réponse est probablement loin, beaucoup trop tard, mais pour une optimisation agressive, l'option "-fast" semble être la solution la plus simple. Extraits de la page de manuel:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
user5428
la source