Vous êtes ici : Support technique → Calcul scalaire sur Vargas → Système de compilation Fortran → Options principales du système de compilation.
C'est l'option -O (la lettre majuscule o) qui permet de gérer l'optimisation
d'un code. À sa suite, il est possible d'indiquer un niveau
d'optimisation (zéro ou entre 2 et 5). L'option -O0 (tiret o majuscule zéro),
équivalente à -qnooptimize, permet d'inhiber l'optimisation
faite par le compilateur.
L'écriture -O est équivalente à -O2.
C'est -O2 qui est désormais le 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 vos modèles.
Important : jusqu'en décembre 2009, les options -O3 -qstrict étaient positionnées par défaut.
Vous auriez donc pu constater, après une simple compilation par défaut, une baisse des performances moyennes de votre code de
calcul : c'est normal. Si, par contre, vous spécifiiez déjà vous-même des options
d'optimisation à la compilation (script, Makefile, voire compilation en batch),
ces changements n'auraient dû avoir que peu d'impact.
Nous conseillons, après avoir vérifié vos résultats sur des cas
tests connus et validés, de passer au niveau d'optimisation -O3.
L'accélération peut être significative; la compilation sera nettement plus longue.
Les niveaux -O4 et -O5 introduisent des
optimisations relativement poussées. Elles incluent en particulier la
technique de l'inlining si l'option -qipa est
spécifiée à l'édition de liens également.
Un niveau d'optimisation maximal peut être atteint avec les options
-O5 -qnostrict -qessl à la compilation et -O5
-qnostrict -lessl à l'édition de liens. L'option
-O5 inclut les options -qipa=level=2 et
-qhot=vector. L'option -qunroll est incluse
dès le niveau -O3. Les options -qhot=vector
et -qunroll permettent respectivement d'utiliser les
versions vectorielles de certaines fonctions mathématiques et de
dérouler, quand cela est possible, les boucles imbriquées.
Nous déconseillons l'option -O5 sur l'ensemble du code :
les optimisations plus poussées qui permettent un gain de performances
sur certaines parties du code causent aussi une perte de performances sur d'autres parties .
Aussi vaut-il mieux ne passer cette option que sur les routines du code
que vous connaissez pour être les plus intensives en calcul.
Notez par ailleurs que les temps de compilation deviennent très importants :
si vous compilez en batch, pensez à majorer significativement le temps
elapsed que vous demandez pour cette compilation.
L'option -qessl (-qnoessl par défaut)
permet le remplacement automatique de procédures intrinsèques Fortran
(comme MATMUL par ex.) par des appels à des fonctions de
la bibliothèque IBM ESSL particulièrement optimisée. Avec cette option
à la compilation, vous devez obligatoirement spécifier
-lessl ou bien -lesslsmp à l'édition de
liens.
xlf, mpxlf_r ou xlf2003 par exemple).
Le plus simple pour obtenir cette liste est donc d'utiliser l'option :
-qlistopt.
Par exemple :
vargas : xlf90 -qlistopt prog.f90La liste des options actives est alors disponible dans le fichier
prog.lst généré par le compilateur.
xlf90, xlf90_r ou mpxlf90_rsur Vargas, qui appelle le manuel du compilateur.
prog.o les options qui ont
été passées au compilateur dans la ligne de commande de compilation:
vargas : xlf90 -c -qsaveopt prog.f90Au début du fichier
prog.o sont écrites les options de compilation.
-c .
Des options permettent, à l'issue de la compilation, de récupérer certains
types d'informations dans un fichier dont le nom est celui du fichier compilé
suffixé par .lst :
-qsource : liste du source du programme compilé,-qattr : liste des références croisées,-qsmplist : liste des transformations faites pour
un code OpenMP,-qreport : liste des transformations liées à
l'optimisation (boucles, appel de fonctions ESSL, etc.) ou à la
parallélisation. Pour plus d'information sur cette option,
consultez le chapitre 6 du
XL Fortran Compiler Reference
-qoptdebug pseudo code optimisé rajouté par le compilateur en plus du source FortranPar exemple :
vargas : xlf90 -qsource -qlistopt prog.f90
Dans une phase de débogage, les options suivantes peuvent être d'une aide précieuse :
-g
génère une table des symboles (numéro de ligne, variables, ...) qui
pourra être exploitée par un débogueur par la suite. Elle permet aussi de
générer les numéros d'instructions dans les tracebacks. Cette option
conserve le niveau d'optimisation demandé,-qnooptimize ou -O0 (o majuscule et zéro)
permettent d'inhiber toute optimisation,-qinitauto=7FBFFFFF
initialise au préalable toutes les variables temporaires à NaNs (ou à
zéro si -qinitauto seul),-C
génère un signal SIGTRAP lorsqu'un tableau est adressé en dehors de ses bornes
(bound checking). Pour intercepter ce signal l'option -qsigtrap
décrite ci-dessous est nécessaire,-qfloat=nans
permet la mise en évidence à l'exécution des opérations portant sur
des valeurs invalides NaN.-qflttrap=overflow:underflow:zerodivide:invalid:enable
permet de détecter les exceptions (overflow, underflow,
division par zéro, opération invalide).-qsigtrap
intercepte le signal SIGTRAP émis suite à une exception ou à un débordement
de tableau et interrompt l'exécution avec impression d'une traceback
(voir aussi l'option -g).-qsave
force le mode d'exécution statique. Sur Vargas, par défaut, nous
sommes en mode stack (recommandé mais révélateur d'erreurs de
programmation cachées par le mode statique !) ; les variables
locales sont alors stockées temporairement dans la zone mémoire dite
stack. Si cette option provoque un retour à la "normale", il
faut sûrement incriminer des variables locales non initialisées ou non
sauvegardées à tort (cf. attribut SAVE), comme les compteurs
incrémentés à chaque appel de procédure.-qextchk
(option inutilisable sur un code MPI) pour vérifier, entre autres, la
cohérence des types et des profils de tableaux. Le compilateur
vérifie ainsi que les déclarations d'un même bloc commun dans
plusieurs unités de programme sont cohérentes. Il vérifie que le type
d'un paramètre d'une procédure est identique à celui de l'argument
correspondant dans un appel de cette procédure, même si l'interface de
la procédure n'est pas explicite. Cette option est utile non seulement
à la compilation mais aussi à l'édition de liens.-qkeepparm pour obliger le compilateur à conserver dans
le stack les valeurs des arguments d'appel (certaines optimisations
peuvent changer cela). Celles-ci seront ainsi récupérables dans n'importe quel débogueur.Il existe aussi une option -qlanglvl
pour vérifier la conformité du source à une norme Fortran. Par exemple
-qlanglvl=2003std pour la norme Fortran 2003.
Exemple de gestion de débordement de tableaux :
vargas : xlf90 -g -C -qsigtrap debordement.f90
vargas : ./a.out
Signal received: SIGTRAP - Trace trap
Fortran language trap: subscript out of bounds
Traceback:
Offset 0x00000090 in procedure debord, near line 6 in file debordement.f90
--- End of call chain ---
Exemple utilisant toutes les options décrites :
vargas : xlf90 -qnooptimize -g -C -qinitauto=7FBFFFFF \ -qflttrap=overflow:underflow:zerodivide:invalid:enable -qfloat=nans \ -qsigtrap -qextchk -qkeepparm -qlanglvl=90std test.f90 vargas : ./a.out
Voir aussi le paragraphe : Outils de débogage.
Il existe en outre des options de compilation permettant de modifier de façon globale la longueur des variables :
Par exemple :
vargas : xlf90 -qintsize=8 prog.f90promotion sur 8 octets des entiers par défaut,
vargas : xlf90 -qautodbl=dbl4 prog.f90promotion sur 8 octets des réels et des complexes de taille 4 octets.
Pour plus de détails, consultez le chapitre 6 et l'annexe A du manuel IBM XL Fortran Compiler Reference
Exemple d'utilisation pour écrire un fichier binaire FORTRAN IEEE little-endian sur l'unité 12 :
vargas : mpxlf90_r -o prog_little_endian prog_little_endian.f90 vargas : export XLFRTEOPTS=ufmt_littleendian=12 vargas : export MP_PROCS=2 vargas : ./prog_little_endianPour plus d'informations, une documentation IBM