Aller au contenu principal

Options des compilateurs Intel (Fortran, C/C++)

Nous ne détaillons ici qu'une partie des options proposées par les compilateurs Intel. Nous vous invitons à consulter les manuels d' ifort et d' icc disponibles sur Jean Zay (commandes man ifort et man icc) pour des informations détaillées sur toutes les options disponibles.

Options d'optimisation​

C'est l'option -O (la lettre o majuscule) qui permet de gérer l'optimisation d'un code. Il est possible d'indiquer le niveau d'optimisation désiré en adjoignant une valeur entiÚre (0, 1, 2 ou 3). L'option -O0 (tiret o majuscule zéro) permet d'inhiber toute optimisation faite par le compilateur. L'écriture -O (tiret o majuscule seul) est équivalente à -O2 ; c'est par ailleurs le niveau d'optimisation par défaut.

attention

À partir du niveau 3, la sĂ©mantique du programme peut ĂȘtre modifiĂ©e. Par exemple : (2.*3.1)*4.2 peut ĂȘtre interprĂ©tĂ© comme 2.*(3.1*4.2). Soyez donc trĂšs vigilants quant aux rĂ©sultats de vos calculs : il est nĂ©cessaire, Ă  partir de -O3, de valider les rĂ©sultats de votre modĂšle en les comparant avec une exĂ©cution rĂ©alisĂ©e avec une optimisation modĂ©rĂ©e ou sans aucune optimisation.

Options d'optimisationCommentaires
-O0Aucune optimisation effectuée.
-O1Quelques optimisations permettent d'accélérer modérément les calculs.
-O2 ou -O (défaut)Niveau d'optimisation incluant la vectorisation, l'inlining, le déroulement de boucle, l'optimisation inter-procédurale au sein de chaque fichier source, etc.
-O3Optimisations plus agressives qu'en -O2 avec le prefetching, les transformations de boucle, la duplication de code, ...
-O3 -xHostPermet d'activer la vectorisation AVX2 et partiellement AVX512. Elle déclenche une analyse plus exhaustive des dépendances de données et peut accroßtre le temps de compilation.
-O3 -xHost -qopt-zmm-usage=highPermet d'activer totalement la vectorisation AVX512. Elle déclenche une analyse plus exhaustive des dépendances de données et peut accroßtre le temps de compilation.

Il est possible que votre code ne donne pas les mĂȘmes rĂ©sultats en -O3 qu'en -O2. Vous pouvez alors obtenir un niveau d'optimisation intermĂ©diaire en ajoutant l'option -fp-model suivie d'un mot clĂ© (par exemple -O3 -fp-model precise).

Options d'optimisationCommentaires
-O3 -fp-model strictLes optimisations effectuées assurent la précision des calculs sur les nombres en virgule flottante (niveau le plus strict). De plus, la gestion des exceptions est activée.
-O3 -fp-model strict -fp-model no-exceptComme précédemment, mais sans la gestion des exceptions.
-O3 -fp-model preciseAssure la précision des calculs sur les nombres en virgule flottante. Il n'y a pas de gestion des exceptions.
-O3 -fp-model precise -fp-model exceptComme précédemment, mais avec la gestion des exceptions.
-O3 -fp-model fast=1 ou -O3 -fp-model fastAutorise des optimisations plus agressives pouvant altĂ©rer la prĂ©cision des calculs sur les nombres en virgule flottante. Peut donner de meilleures performances, mais ne peut pas ĂȘtre combinĂ©e avec la gestion des exceptions (-fp-model except).
-O3 -fp-model fast=2Le code peut ĂȘtre encore plus rapide et moins prĂ©cis qu'avec -fp-model fast=1. Ne peut pas ĂȘtre combinĂ©e avec la gestion des exceptions (-fp-model except).
remarque

En l'état actuel, l'option -fast est équivalente aux options : -ipo -O3 -no-prec-div -xHost -static. Pour obtenir un exécutable, il est nécessaire d'enlever l'option -static. Comme nous vous déconseillons de spécifier l'option -fast de façon isolée, utilisez plutÎt : -ipo -O3 -no-prec-div -xHost.

Options mĂ©moire​

Options mémoireCommentaires
-autoLes variables locales dĂ©clarĂ©es au sein d'une unitĂ© de programme sans l'attribut SAVE et non initialisĂ©es seront allouĂ©es Ă  l'entrĂ©e de cette unitĂ© dans la pile d'exĂ©cution (stack). Cette option rĂ©duit la taille de l'exĂ©cutable (zones statiques DATA et BSS). Les variables locales doivent ĂȘtre valorisĂ©es explicitement sinon elles ont une valeur indĂ©finie (l'option -ftrapuv permet de dĂ©tecter les variables non initialisĂ©es). Par dĂ©faut, -auto-scalar est activĂ© (seules les variables locales scalaires sont allouĂ©es dans le stack). L'option inverse est -save, oĂč toutes les variables locales hĂ©ritent de l'attribut SAVE et sont allouĂ©es statiquement dans la zone BSS et initialisĂ©es Ă  une valeur nulle.
-mcmodel=smallL'espace mémoire réservé au code (zone TXT) et aux données (zones DATA et BSS) est limité à 2 Go. Cette valeur est suffisante dans la plupart des cas et garantit les meilleures performances.
-mcmodel=medium -shared-intelSeul l'espace mĂ©moire rĂ©servĂ© au code (zone TXT) est limitĂ© Ă  2 Go, sans restriction pour les donnĂ©es. Les performances peuvent ĂȘtre lĂ©gĂšrement dĂ©gradĂ©es. Cette option est nĂ©cessaire si vous utilisez des donnĂ©es statiques et globales (comme des tableaux statiques) dont la taille dĂ©passe 2 Go. Notez que l'option -shared-intel doit aussi ĂȘtre spĂ©cifiĂ©e.
-mcmodel=large -shared-intelIl n'y a aucune restriction sur l'espace mĂ©moire rĂ©servĂ© au code ou aux donnĂ©es. Les performances peuvent ĂȘtre lĂ©gĂšrement dĂ©gradĂ©es. Notez que l'option -shared-intel doit aussi ĂȘtre spĂ©cifiĂ©e.
remarque

Les options -mcmodel=medium -shared-intel doivent ĂȘtre ajoutĂ©es Ă  la compilation et Ă  l'Ă©dition de liens sinon vous obtiendrez des messages du type :

relocation truncated to fit: R_X86_64_PC32 against symbol ...

Ces messages peuvent apparaĂźtre lorsque l'on utilise des gros tableaux statiques, par exemple.

Options de diagnostic​

Lors de la compilation, des options permettent de récupérer certains messages de diagnostic sur la sortie standard ou dans un fichier :

Option de listageCommentaires
-qopt-report=[n]GénÚre, sur la sortie standard, un rapport des transformations liées à l'optimisation (inlining, vectorisation, déroulement de boucle, etc.). n est optionnel et peut valoir 0, 1, 2 ou 3 (par défaut 2). Plus n est grand, plus le rapport est détaillé.
-opt-report-file=filenameGénÚre un rapport dans le fichier spécifié par filename. Dans ce cas, il n'est plus nécessaire de spécifier l'option -qopt-report.
-qopt-report-phase=phase -qopt-reportCombinaison de deux options permettant de générer un rapport des optimisations effectuées par l'élément phase de l'optimiseur. phase peut valoir :
ipo : Interprocedural Optimizer phase;
hlo : High Level Optimizer phase;
hpo : High Performance Optimizer phase;
ilo : Intermediate Language Scalar Optimizer phase;
pgo : Profile Guided Optimization phase;
openmp : OpenMP;
par : Auto-parallélisation;
vec : Vectorisation;
all : All optimizer phases.

Exemples :

ifort -O3 -qopt-report=3 prog.f90
ifort -O3 -qopt-report-file=my_report_file prog.f90
ifort -O3 -qopt-report=3 -qopt-report-phase=par -parallel prog.f90
icc -O3 -qopt-report=3 prog.c
icc -O3 -qopt-report-file=my_report_file prog.c
icc -O3 -qopt-report=3 -qopt-report-phase=par -parallel prog.c

Options de dĂ©bogage des compilateurs Fortran et C/C++​

Dans une phase de dĂ©bogage, les options suivantes peuvent ĂȘtre utilisĂ©es avec le compilateur Fortran comme avec le compilateur C/C++. Nous vous invitons Ă  consulter l'aide des compilateurs sur Jean Zay (commandes man ifort et man icc) pour obtenir de plus amples informations.

Option de débogageCommentaires
-gGĂ©nĂšre la table des symboles (numĂ©ros de ligne, variables, ...). Cette table peut ĂȘtre exploitĂ©e par un dĂ©bogueur. Cette option conserve le niveau d'optimisation explicitement demandĂ© (-O1, -O2 ou -O3). Sans optimisation spĂ©cifiĂ©e explicitement, toute optimisation est dĂ©sactivĂ©e (-g Ă©quivaut Ă  -g -O0).
-debug
ou -debug full
ou -debug all
GénÚrent les informations complÚtes de débogage. Recommandées avec -g et un niveau d'optimisation spécifique (-O1, -O2 ou -O3). Par exemple : -g -O2 -debug.
-tracebackPermet d'obtenir plus d'informations lorsqu'une erreur se produit à l'exécution. Cette option est aussi positionnée avec -g.
-ftrapuvInitialise les variables locales dans la stack avec des valeurs aberrantes (entier trÚs grand, adresse invalide). Permet de détecter les variables non initialisées en provoquant une erreur à l'exécution. Positionne également l'option -g.
-check uninit (Fortran)
-check=uninit (C)
Détecte à l'exécution si des variables scalaires de type intrinsÚque (integer, real, complex, logical) et sans attribut SAVE ne sont pas initialisées.
-fp-stack-checkPermet de générer une exception dÚs qu'un appel de fonction retourne une valeur incorrecte.
-no-ftzL'option -ftz est activée par défaut avec les optimisations -O1, -O2, et -O3. Elle met à zéro les nombres dé-normalisés trÚs petits durant l'exécution, ce qui peut produire des résultats erronés. L'option -no-ftz permet de désactiver cette fonctionnalité et de détecter ces underflows.

Options de dĂ©bogage du compilateur Fortran​

Avec le compilateur Fortran, vous pouvez aussi utiliser les options suivantes :

Option de débogageCommentaires
-debug-parameters allGénÚre des informations de debug pour les variables de type PARAMETER. Ceci est nécessaire pour voir les valeurs des PARAMETER avec un débogueur.
-heap-arraysPlace tous les tableaux temporaires ou automatiques dans le heap au lieu de la stack si cette derniÚre se révÚle trop petite.
-init=arrays,snanForce à NaN toutes les variables de type intrinsÚque ainsi que les tableaux non initialisés. Cette option implique -fpe0. Pour éviter de récupérer des exceptions qui ne soient pas relatives à des variables non-initialisées, il est recommandé de réduire le niveau d'optimisation à -O1 ou -O0. Alternativement, vous pouvez utiliser -fp-speculation=safe pour la détection de variables non-initialisées.
-fpe-all=0 -no-ftz -tracebackCette combinaison d'options stoppe l'exécution dÚs qu'une exception (overflow, underflow, division par zéro, opération invalide, etc.) se produit. Elle indique à quel niveau du code elle s'est produite. Le contrÎle s'effectue dans chaque subroutine, contrairement à l'option -fpe0 qui agit uniquement sur le programme principal.
-check boundsDétecte à la compilation et à l'exécution si un tableau est adressé en dehors de ses bornes (bound checking).
-check pointersDétecte à l'exécution si un pointeur est initialisé ou non, si un tableau allocatable est alloué ou non lors de l'utilisation des pointeurs.
-check allActive les deux options listées ci-dessus simultanément.
-warn declarationsGénÚre les messages signalant toutes les variables non déclarées (comme si le code source comportait un IMPLICIT NONE).
-warn interfacesGénÚre les messages signalant les incohérences entre les appels et les définitions de chaque sous-routine et chaque fonction du code. Notez que le compilateur génÚre un bloc d'interface pour chacune d'entre elles (option -gen-interfaces implicite).
-warn truncated_sourcePour les fichiers au format fixe, le compilateur émettra un message si une ligne du source dépasse la longueur maximale autorisée (défaut : 72 caractÚres).
Notez que cette longueur peut ĂȘtre portĂ©e Ă  132 caractĂšres maximum avec l'option -extend_source.
-warn all ou -warnGénÚrent les divers messages d'avertissement simultanément (notamment ceux cités ci-dessus).
-stand f08Des avertissements sont générés si la norme Fortran 2008 n'est pas respectée.

Options de dĂ©bogage du compilateur C/C++​

Avec le compilateur C/C++, vous pouvez aussi utiliser l'option suivante :

Option de débogageCommentaires
-check-pointers=rwPermet de détecter à l'exécution les accÚs mémoire invalides lors de l'utilisation de pointeurs. Cela inclut l'utilisation des tableaux, qu'ils aient été alloués dynamiquement ou non.

Exemples :

ifort -g -debug -fpe-all=0 -no-ftz -traceback -fp-stack-check -check all -warn all -stand f08 my_prog.f90
icc -g -debug -no-ftz -traceback -fp-stack-check -check=uninit -check-pointers=rw my_prog.c

Liste des options activĂ©es pour le compilateur Fortran​

La liste des options activĂ©es par dĂ©faut par le compilateur Intel peut Ă©voluer dans le temps, mais aussi en fonction du contexte d'appel du compilateur. Ainsi, il est possible qu'avec des versions diffĂ©rentes une compilation que vous lanciez sur un mĂȘme code avec les mĂȘmes options gĂ©nĂšre un exĂ©cutable qui ne donne pas exactement les mĂȘmes rĂ©sultats. Il est donc utile de gĂ©nĂ©rer un listing de la compilation d'un fichier source en utilisant l'option -list :

ifort -list prog.f90

Cette commande crĂ©e le fichier prog.lst dans le mĂȘme rĂ©pertoire que le fichier source
Par défaut, il contient :

  • le contenu des fichiers inclus via l'instruction INCLUDE,
  • la liste des symboles pour chaque sous-routine,
  • la liste des options de compilation.

L'option -show mot-clef permet de restreindre l'action de l'option -list :

  • -show noinclude supprime le contenu des fichiers inclus via l'instruction INCLUDE,
  • -show nomap supprime la liste des symboles pour chaque sous-routine,
  • -show nooptions supprime la liste des options de compilation.

Taille des diffĂ©rents types de base Fortran​

Les variables déclarées à l'aide des types par défaut INTEGER, REAL ou COMPLEX font l'objet d'une réservation en mémoire basée sur des mots de 4 octets. Le paramÚtre optionnel KIND=n indiqué à la suite du type dans le code source permet d'influer sur cette taille ; c'est la façon la plus explicite et la plus sûre de le faire.

Il existe par ailleurs des options de compilation permettant de modifier de façon globale la longueur des variables, mais nous déconseillons formellement leur utilisation pour des raisons de portabilité :

  • les options Ă©quivalentes ne fonctionnent pas de la mĂȘme façon sur des plateformes diffĂ©rentes,
  • il est trĂšs facile d'oublier ces options lorsqu'on compile son code ou qu'on le partage avec quelqu'un d'autre; dans ce cas les rĂ©sultats de l'exĂ©cution sont faux !

Afin de permettre quelques tests ponctuels, ces options sont les suivantes :

  • -integer-size 16/32/64 force la rĂ©servation en mĂ©moire des entiers et logiques dĂ©clarĂ©s avec le type INTEGER ou LOGICAL (sans spĂ©cification du paramĂštre KIND=n) sur des mots de 2/4/8 octets (4 par dĂ©faut);
  • -real-size 32/64/128 : les entitĂ©s dĂ©clarĂ©es avec le type REAL ou COMPLEX (sans spĂ©cification du paramĂštre KIND=n) sont promues respectivement sur 4, 8 et 16 octets.

Lire ou Ă©crire un fichier binaire IEEE big-endian en Fortran​

Jean Zay est une machine Linux : par défaut, elle génÚre donc des fichiers binaires Fortran au format little-endian. Pour écrire ou lire un fichier binaire IEEE big-endian en Fortran, il faut utiliser la variable d'environnement F_UFMTENDIAN.
Pour lire un fichier binaire écrit en big-endian (provenant par exemple de notre ancienne IBM Power6 Vargas) sur l'unité 12 :

ifort -o prog_big_endian prog_big_endian.f90
export F_UFMTENDIAN=big:12
./prog_big_endian
remarque

Si vous ne spĂ©cifiez pas de numĂ©ro d'unitĂ© logique, alors la variable opĂšre sur toutes les unitĂ©s. Par consĂ©quent tous les fichiers sont considĂ©rĂ©s comme ayant le mĂȘme format (big-endian dans cet exemple) :

ifort -o prog_big_endian prog_big_endian.f90
export F_UFMTENDIAN=big
./prog_big_endian

Il est possible de spécifier plusieurs unités logiques ; ici, les unités 12, 15 et toutes celles de 20 à 30 :

export F_UFMTENDIAN="big:12,15,20-30"
./prog_big_endian
attention

Dans le cas d'un fichier à accÚs direct, la taille de l'enregistrement, indiqué lors de l'OPEN du fichier dans le code source au moyen du mot-clef RECL, est interprété en mots de 4 octets. Pour spécifier cette taille d'enregistrement directement en octets lors de l'OPEN, il faut compiler avec l'option -assume byterecl :

ifort -assume byterecl -o prog_big_endian prog_big_endian.f90
export F_UFMTENDIAN=big:12
./prog_big_endian