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.
à 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'optimisation | Commentaires |
|---|---|
-O0 | Aucune optimisation effectuée. |
-O1 | Quelques 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. |
-O3 | Optimisations plus agressives qu'en -O2 avec le prefetching, les transformations de boucle, la duplication de code, ... |
-O3 -xHost | Permet 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=high | Permet 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'optimisation | Commentaires |
|---|---|
-O3 -fp-model strict | Les 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-except | Comme précédemment, mais sans la gestion des exceptions. |
-O3 -fp-model precise | Assure 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 except | Comme précédemment, mais avec la gestion des exceptions. |
-O3 -fp-model fast=1 ou -O3 -fp-model fast | Autorise 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=2 | Le 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). |
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émoire | Commentaires |
|---|---|
-auto | Les 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=small | L'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-intel | Seul 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-intel | Il 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. |
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 listage | Commentaires |
|---|---|
-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=filename | Gé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-report | Combinaison 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ébogage | Commentaires |
|---|---|
-g | GĂ©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). |
-debugou -debug fullou -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. |
-traceback | Permet d'obtenir plus d'informations lorsqu'une erreur se produit à l'exécution. Cette option est aussi positionnée avec -g. |
-ftrapuv | Initialise 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-check | Permet de générer une exception dÚs qu'un appel de fonction retourne une valeur incorrecte. |
-no-ftz | L'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ébogage | Commentaires |
|---|---|
-debug-parameters all | Gé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-arrays | Place 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,snan | Force à 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 -traceback | Cette 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 bounds | Détecte à la compilation et à l'exécution si un tableau est adressé en dehors de ses bornes (bound checking). |
-check pointers | Dé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 all | Active les deux options listées ci-dessus simultanément. |
-warn declarations | GénÚre les messages signalant toutes les variables non déclarées (comme si le code source comportait un IMPLICIT NONE). |
-warn interfaces | Gé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_source | Pour 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 -warn | GénÚrent les divers messages d'avertissement simultanément (notamment ceux cités ci-dessus). |
-stand f08 | Des 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ébogage | Commentaires |
|---|---|
-check-pointers=rw | Permet 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 noincludesupprime le contenu des fichiers inclus via l'instruction INCLUDE,-show nomapsupprime la liste des symboles pour chaque sous-routine,-show nooptionssupprime 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/64force la réservation en mémoire des entiers et logiques déclarés avec le typeINTEGERouLOGICAL(sans spécification du paramÚtreKIND=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 typeREALouCOMPLEX(sans spécification du paramÚtreKIND=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
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
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