Environnement XLC
Options de compilation pour le compilateur C d'IBM : déboguage, optimisation, profilage, OpenMP, MPI
Compilateur XLC
Messages d'erreur courants
Listings du compilateur
La compilation
Introduction
La compilation consiste à traduire un programme écrit dans un langage de programmation de haut niveau dans un programme en langage machine. L'application qui effectue cette traduction s'appelle un compilateur .Il existe plusieurs commandes pour invoquer le compilateur C, xlc et le type de programmation (séquentielle, parallèle). La différence principale réside dans les options de compilation prises par défaut.
1. Les commandes de compilation
Les tableaux suivants décrivent ces différentes situations :
| Langage | Commande |
|---|---|
| C / C++ | xlc / xlC |
| C / C++ et MPI | mpxlc / mpxlC |
| C / C++ et OpenMP | xlc_r / xlC_r |
| C / C++ et MPI et OpenMP | mpxlc_r / mpxlC_r |
L'extension _r signifie que le compilateur supporte les threads selon la norme POSIX qui sont par exemple employées pour la parallélisation par OpenMP et qu'il est aussi threadsafe.
Le préfixe mp signifie que le compilateur définit les chemins pour chercher les fichiers et bibliothèques spécifiques à MPI (Messages Passing Interface).
Retour au début de la section .Des options qui contrôlent les entrées fournies au compilateur
Les options suivantes affectent de manière importante ce qui est envoyé au compilateur : les fichiers source traités, la sensibilité aux majuscules / minuscules, la sensibilité aux positions dans les colonnes.
1. Option -Idir
Cette option ajoute le répertoire dir dans le chemin de recherche des fichiers à inclure, fichiers headers (.h) et fichiers modules (.mod). Le chemin par défaut comprend les répertoires suivants qui sont parcourus dans cet ordre :- répertoire courant,
- répertoire du fichier source,
- répertoire /usr/include.
Retour au début de la section .
2. Options -qdirective[=directive_list] et -qnodirective[=directive_list]
Ces options spécifient des séquences de caractères, aussi appelées sentinelles, qui permettent au compilateur d'identifier des lignes de commentaires comme étant des directives. Par exemple, les sentinelles OpenMP, $OMP, ne sont reconnues que si l'option -qsmp=omp est fournie au compilateur.On peut ainsi définir des directives dont la prise en compte est décidée à la compilation. Plusieurs de ces options peuvent apparaitre dans la séquence de compilation, elles sont "additives".
L'option par défaut est -qnodirective.
Retour au début de la section .3. Proposition d'options pour contrôler les entrées fournies au compilateur
Une séquence basique d'options pourrait être :Voir aussi la rubrique Exemples de fichiers de compilation
Des options qui contrôlent la localisation des fichiers générés par le compilateur
Les options suivantes spécifient les noms ou les répertoires de stockage des fichiers générés.
1. Option -o name
L'option -o permet de spécifier un nom pour le fichier objet, l'exécutable ou le fichier source assembleur.Le défaut est -o a.out .
Retour au début de la section .
2. Proposition d'options pour contrôler la localisation des fichiers générés par le compilateur
Une séquence basique d'options pourrait être :Voir aussi la rubrique Exemples de fichiers de compilation
Des options qui contrôlent le listing et les messages
Les options suivantes déterminent si le compilateur génère des fichiers listing (extension .lst), quels types d'information y sont mis et ce qu'il fait en cas d'erreur détectée.
1.
Cette option génère des informations sur la progression de la compilation sans l'effectuer réellement.Elle permet de connaitre les fichiers impliqués dans une compilation particulière et les options activées pour chaque phase.
Il n'y a pas d'affichage par défaut.
Retour au début de la section .
2.
Ces options spécifient si des informations liées aux arguments transmis aux sous-programmes sont mises ou pas dans le listing généré.L'attribut full insère ces informations aussi pour les arguments transmis mais non référencés. -qnoattr est l'option par défaut. Retour au début de la section .
3. Option -qflag=listing_severity:terminal_severity
En cas d'utilisation de cette option, on doit spécifier ces deux arguments. Ils limitent l'affichage de messages à ceux du niveau spécifié ou au-delà. Ainsi :- listing_severity s'applique aux messages inclus dans les fichiers listing (extension .lst) ;
- terminal_severity s'applique aux messages envoyées sur le terminal.
Les niveaux de sévérité, par ordre croissant, sont :
- i (informational messages) : messages d'information. Ils expliquent des choses à savoir mais en général ils ne demandent pas de réaction en retour ;
- l (language-level messages) : messages liés au langage comme ceux produits par -qlanglvl . Ils indiquent des constructions potentiellement non portables ;
- w (warning messages) : messages d'avertissement. Ils indiquent des possibilités d'erreur qui peuvent nécessiter une réaction, cependant le programme est encore correct ;
- e (error messages) : messages d'erreur. Ils indiquent des erreurs qui nécessitent une réaction pour que le programme soit correct mais le programme peut peut-être encore être exécuté;
- s (severe error messages) : messages d'erreur sévère. Ils indiquent des erreurs qui nécessitent une réaction pour que le programme soit correct et le programme plantera à l'exécution s'il atteint cet endroit ;
- u (unrecoverable error messages) : message d'erreur irrécupérable. Ils indiquent des erreurs qui empêchent le programme de continuer. Elles nécessitent une action pour poursuivre la compilation.
4. Options -qlist et -qnolist
Ces options spécifient si la partie objet doit être incluse ou pas dans le listing généré.Ces informations peuvent contribuer à comprendre les caractéristiques de performance du code objet et à diagnostiquer des problèmes d'exécution. -qnolist est l'option par défaut. Retour au début de la section .
5. Options -qlistopt et -qnolistopt
Ces options spécifient si l'état de chaque option du compilateur doit être inclus dans le listing généré ou bien si seules certaines options sont concernées. Il s'agit alors des options présentes sur la ligne de commande et un certain nombre d'options toujours présentes dans le fichier listing.Les options toujours affichées sont :
- toutes les options que l'on peut activer/désactiver et qui sont activées ;
- toutes les options que l'on peut activer/désactiver et qui sont désactivées ;
- toutes les options qui prennent des arguments numériques arbitraires;
- toutes les options qui ont plusieurs arguments.
6. Option -qnoprint
Cette option supprime la création du fichier listing quelles que soient les autres options présentes. Retour au début de la section .
7. Options -qreport[=smplist|hotlist] et -qnoreport
Ces options spécifient si des comptes-rendus sur la parallélisation du programme et l'optimisation des boucles sont produits.On peut utiliser l'argument smplist pour déboguer des programmes SMP ou affiner leurs performances en examinant les transformations à bas niveau. Il fournit aussi des informations sur les boucles non parallélisées.
On peut utiliser l'argument hotlist pour générer un compte-rendu sur les transformations des boucles.
L'argument smplist produit un listing pseudo-code avant les optimisations de boucles qui contient des informations sur les structures qui peuvent être modifiées pour améliorer les performances. On peut voir comment le programme traite les données et la parallélisation automatique des boucles. Les commentaires au sein du listing donnent les correspondances entre le code parallèle et le code source initial. Il fournit aussi des informations sur les boucles non parallélisées. Ce compte-rendu est construit si l'option -qsmp est présente.
L'argument hotlist produit un listing pseudo-code qui montre comment les boucles sont transformées. De plus, cet argument est celui pris par défaut si l'option -qreport apparait seule.
8. Options -qsource et -qnosource
Ces options spécifient si la partie source doit être incluse ou pas dans le listing généré.Si c'est le cas, on obtient toutes les lignes sur lesquelles le compilateur a détecté un problème. -qnosource est l'option par défaut. Retour au début de la section .
9. Options -qxref[=full] et -qnoxref
Ces options spécifient si la partie référence croisée doit être incluse ou pas dans le listing généré.Si on spécifie -qxref, seuls les identifiants référencés sont pris en compte.
Si on spécifie -qxref=full, tous les identifiants sont pris en compte.
On peut utiliser ce listing durant le déboguage pour localiser des problèmes comme l'utilisation de variables non définies.
-qnoxref est l'option par défaut.
Retour au début de la section .
10. Options -v et -V
L'option -v génère des informations sur la progression de la compilation en temps réel.Elle permet de connaitre les fichiers impliqués dans une compilation particulière, les options activées pour chaque phase et voir jusqu'où elle arrive en cas d'échec.
L'option -V fait de même mais les commandes affichées peuvent être utilisées dans des "copier/coller".
Il n'y a pas d'affichage par défaut. Retour au début de la section .
11. Options -qsuppress=nnnn-mmm[:nnn-mmmm] et -qnosuppress
Ces options spécifient si le compilateur supprime ou non l'affichage de messages lors de la compilation, messages choisis par l'utilisateur. Les messages ont un numéro, sous la forme nnn-mmmm. L'option par défaut est -qnosuppress. Retour au début de la section .
12. Proposition d'options qui contrôlent le listing et les messages
Une séquence basique d'options pour un programme C sans OpenMP pourrait être :Une séquence basique d'options pour un programme C avec OpenMP pourrait être :
Des options qui contrôlent les limites du compilateur
Les options suivantes contrôlent le mode d'adressage et certaines limites du compilateur.
1. Options -q32 et -q64
Ces options provoque la création par la compilation de fichiers objet en mode d'adressage 32 bits ou 64 bits. Par défaut, il s'agit le mode 32 bits est choisi.Le passage du mode d'adressage 32 à 64 bits nécessite une recompilation complète du programme concerné.
De plus, ce passage a une incidence sur les quantités mémoire que peuvent occuper la stack et le heap. En mode 64 bits, ils peuvent occuper plusieurs millions de Go de mémoire, donc il ne faut plus spécifier les options -bmaxdata et -bmaxstack. Retour au début de la section .
2. -qmaxmem=Kbytes
Cette option limite le volume mémoire maximal que le compilateur peut allouer durant la phase de compilation. Une valeur -1 indique qu'il peut prendre toute la mémoire dont il a besoin. Par défaut, la valeur est 2048. Pour le niveau d'optimisation -O3, elle devient -1. Retour au début de la section .
3. -Wcomponent,options
Cette option du compilateur permet de transmettre des options à un outil utilisé durant la compilation.Les initiales suivantes désignent l'outil destinataire :
- p : un préprocesseur pour l'optimisation ;
- F : le préprocesseur C, cpp;
- c : le compilateur ;
- d : le désassembleur ;
- I : l'analyseur interprocédural;
- a : l'assembleur ;
- z : l'éditeur de liens rapide (binder);
- l : l'éditeur de liens (linker) ;
Des options de déboguage
Les options suivantes aident à éviter, détecter et corriger des problèmes dans les programmes C.
1. Options -qcheck[=suboptions] et -qnocheck
Ces options vérifient ou non chaque référence faite à un élément de tableau, une section de tableau ou un élément de chaines de caractères ou bien les divisions entières par zéro, les pointeurs, ou l'ensemble.L'option -qcheck supporte les arguments suivants :
- bounds : détecte et trappe les débordements d'objets adressés lorsque leur(s) dimension(s) sont connue(s) ;
- divzero : détecte et trappe les divisions entières par zéro ;
- nullptr : détecte et trappe les divisions flottantes par zéro si la recherche des exceptions est activé ;
- all : active les trois sous-options précédentes.
2. Options -g, -qdbxextra et -qnodbxextra
L'option -g ajoute des informations sur les symboles (variables locales, arguments transmis, correspondance code assembleur / lignes du fichier source, ...) dans le code généré qui peuvent ensuite être utilisées par un débogueur symbolique comme dbx.
Les options -qdbxextra et -qdbxextra spécifie que toutes les déclarations typedef, tes définitions struct, union, enum sont incluses pour le déboguage.
-qnodbxextra est l'option par défaut.
Retour au début de la section .
3. Options -qextchk et -qnoextchk
Ces options mettent en place ou non les informations nécessaires à la vérification des types des données pour les blocs common, les définitions des procédures, les appels aux procédures et les modules. Par la suite, l'éditeur de liens, peut détecter des incohérences entre les différentes unités compilées.-qnoextchk est l'option par défaut.
Retour au début de la section .
4. Options -qflttrap[=suboptions] et -qnoflttrap
Ces options déterminent quels types d'exception flottante sont détectées lors de l'exécution. Le programme reçoit un signal SIGTRAP lorsque l'exception correspondante survient.Les arguments transmis à cette option sont parmi :
- OVerflow : détecte et trappe les overflows (nombres trop grands) si la recherche des exceptions est activé ;
- UNDerflow : détecte et trappe les underflows (nombres subnormaux) si la recherche des exceptions est activé ;
- ZEROdivide : détecte et trappe les divisions flottantes par zéro si la recherche des exceptions est activé ;
- INValid : détecte et trappe les opérations flottantes invalides si la recherche des exceptions est activé ;
- INEXact : détecte et trappe les résultats flottants inexacts si la recherche des exceptions est activé ; comme ils sont très fréquents, on ne devrait pas utiliser cet argument ;
- ENable : active la recherche des exceptions et permet au programme de générer un signal SIGTRAP ; cet argument est nécessaire si on souhaite détecter les exceptions sans devoir modifier son code source (ajout d'appels à des routines spécifiques de gestion des registres flottants comme fpsets, fpgets et fpstats);
- IMPrecise : recherche les exceptions spécifiées uniquement lors de l'entrée et de la sortie des sous-programmes.
-qflttrap=ov:und:zero:inv:en. On peut aussi procéder en deux étapes :
- -qflttrap=ov:und:zero:inv:en:imp pour provoquer les tests et les arrêts uniquement en sortie de sous-programmes (gain en temps)
- -qflttrap=ov:und:zero:inv:en pour recompiler le sous-programme fautif et localiser précisément l'origine du problème.
5. Options -qfullpath et -qnofullpath
Ces options ajoutent ou non le chemin complet, ou absolu, des fichiers sources et headers dans les fichiers objets compilés lorsque les fichiers sont compilés avec l'option -g.Ces options sont utiles pour le déboguage et le profilage. -qnofullpath est l'option par défaut. Retour au début de la section .
6. Option -qhalt=sev
Cette option permet d'arrêter la compilation selon que le niveau de sévérité soit atteint ou dépassé par un message lors de la compilation. Dans ce cas, aucun fichier objet, exécutable ou assembleur n'est crée.Le niveau de sévérité, sev, est l'une des lettres suivantes :
- i (informational messages) : messages d'information. Ils expliquent des choses à savoir mais en général ils ne demandent pas de réaction en retour ;
- l (language-level messages) : messages liés au langage comme ceux produits par -qlanglvl (voir ci-dessous). Ils indiquent des constructions potentiellement non portables ;
- w (warning messages) : messages d'avertissement. Ils indiquent des possibilités d'erreur qui peuvent nécessiter une réaction, cependant le programme est encore correct ;
- e (error messages) : messages d'erreur. Ils indiquent des erreurs qui nécessitent une réaction pour que le programme soit correct mais le programme peut peut-être encore être exécuté ;
- s (severe error messages) : messages d'erreur sévère. Ils indiquent des erreurs qui nécessitent une réaction pour que le programme soit correct et le programme plantera à l'exécution s'il atteint cet endroit ;
- u (unrecoverable error messages) : message d'erreur irrécupérable. Ils indiquent des erreurs qui empêchent le programme de continuer. Elles nécessitent une action pour poursuivre la compilation.
- q : ne s'arrête jamais, quelle que soit la sévérité des erreurs rencontrées.
7. Options -qinitauto[=hexvalue] et -qnoinitauto
Ces options agissent sur l'initialisation des variables automatiques à une valeur particulière, hexvalue. Cela peut être utile d'initialiser les variables REAL avec des NaNS et ensuite d'identifier les références aux variables REAL non initialisées lors de l'exécution. La valeur hexvalue mise à FF initialise les variables de type REAL et COMPLEX à -NaNQ, soit "Not a Number négatif".
-qnoinitauto est l'option par défaut.
Si l'on utilise -qinitauto sans l'argument hexvalue, alors le compilateur initialise les données automatiques à zéro.
8. Option -qsigtrap=trap_handler
Cette option permet de spécifier le gestionnaire d'exceptions flottantes pour traiter les signaux SIGTRAP.Sans argument, le gestionnaire standard xl_ _trce est employé, sinon on spécifie celui que l'on souhaite à l'aide de cette option.
Cette option empêche donc la création de fichier core. Retour au début de la section .
9. Option -qwarn64 -qnowarn64
Cette option permet de détecter la troncature d'un pointeur entier (8 octets) sur 4 octets. Cela peut poser des problèmes lors du passage de 32 bits à 64 bits. -qnowarn64 est l'option par défaut. Retour au début de la section .
10. Proposition d'options de déboguage
Une séquence basique d'options pour déboguer un programme C pourrait être :Les options -qnooptimize et -qfloat=nans sont décrites dans la section Des options d'optimisation. Voir aussi la rubrique Exemples de fichiers de compilation
Des options d'optimisation
Les options suivantes permettent d'augmenter les performances des programmes en activant divers optimiseurs ou d'effectuer leur analyse.
1. Option -qoptimize[=level] et -qnooptimize
Cette option permet de spécifier le niveau d'optimisation du code généré. L'option -qnooptimize est l'option par défaut et inhibe les optimisations ; elle doit être réservée au déboguage et à la validation de codes.De là, on utilise un niveau d'optimisation qui dépend de la stabilité numérique des algorithmes : si on gagne du temps, il ne faut pas perdre de la précision.
-O est une abbréviation de -qoptimize.
Les différents niveaux d'optimisation sont :
- -O2 : niveau d'optimisation qui n'affecte pas la qualité numérique des résultats ;
- -O3 : optimisations supplémentaires qui peuvent affecter la sémentique du programme. Ce niveau d'optimisation active les arguments flint et rsqrt de l'option -qfloat et fixe -qmaxmem=-1 ;
- -O4 : optimisations agressives du code source. Les options suivantes sont activées :
-qhot, -qipa, -O3 (avec ses attributs), -qarch=auto, -qtune=auto et -qcache=auto ; - -O5 : identique au niveau d'optimisation -O4 mais il implique -qipa=level=2.
2. Option -p[g]
Cette option prépare le programme au profilage.Lors de l'exécution du programme, le fichier mon.out est construit et contient des informations de profilage. La commande prof permet d'analyser ce fichier. L'option -pg est similaire à -p mais le fichier produit, gmon.out, contient plus d'informations. La commande gprof permet d'analyser ce fichier. Pour ces deux options, il est recommandé de spécifier également les options -qfullpath et -g pour visualiser les résultats avec l'interface graphique xprofiler. Retour au début de la section .
3. Options -Q -Q[!] -Q[+names] -Q[-names]
Ces options permettent respectivement de spécifier si des routines peuvent être inlinées, de donner une liste de routines à ou à ne pas inliner. Ainsi :- -Q : n'affecte une routine que si le sous-programme appelant et le sous-programme appelés sont dans le même fichier source (ou liés par des directives INCLUDE). Pour traiter le cas de fichiers différents, il faut utiliser l'option -qipa (voir ci-dessous) ;
- -Q+names : force l'inlining des routines en argument ;
- -Q-names : interdit l'inlining des routines en argument ;
- -Q! : inhibe l'inlining.
4. Option -qalias{[no]aryovrlp|[no]intptr|[no]pteovrlp|[no]std}
Cette option indique au compilateur le type d'aliasing utilisé dans le code. Le compilateur limite la portée de certaines optimisations lorsque plusieurs noms peuvent correspondre à la même zone de stockage (ils sont aliasés). Les arguments sont les suivants :- addr : les variables sont disjointent des pointeurs à moins que leur adresse soient prises ;
- allp : les pointeurs ne sont jamais aliasées ;
- ansi : les pointeurs ne peuvent pointer que des objets du même type. Elle nécessitent au moins le niveau -O ;
- typ : les pointeurs vers des types différents ne sont jamais aliasés.
5. Option -qarch=architecture
Cette option contrôle le jeu d'instructions qui est employé pour générer le code. Cela peut améliorer les performances mais le code ne pourra alors plus s'exécuter que sur des architectures spécifiques. Il existe différentes options, mais seules deux nous intéressent réellement :- auto : détection automatique de l'architecture sur laquelle a lieu la compilation. Cela suppose que l'environnement d'exécution est le même que l'environnement de compilation ;
- pwr4 : le code compilé peut être exécuté sur n'importe quelle plate-forme à base de processeurs Power4 (et aussi Power5 par compatibilité ascendante).
- pwr5 : le code compilé peut être exécuté sur n'importe quelle plate-forme à base de processeurs Power5 (mais pas Power4).
La définition de -qarch implique des contraintes sur l'option -qtune décrite ci-dessous. Elles ont un effet positif pour les applications faisant un usage intensif du calcul en nombres flottants.
La définition de -qarch implique des contraintes sur l'option -qtune décrite ci-dessous. Elles ont un effet positif pour les applications faisant un usage intensif du calcul en nombres flottants.
Retour au début de la section .6. Option -qcache=auto
Cette option permet de spécifier la configuration du cache des processeurs de la machine d'exécution. Soit on donne les informations techniques des niveaux de cache soit on le laisse détecter la configuration matérielle ce qui est le plus sûr. Ainsi en cas d'utilisation, il vaut mieux mettre -qcache=auto. Il faut noter que son utilisation n'a d'effet que si l'option -qhot (voir ci-dessous) est présente. Retour au début de la section .
7. Options -qfdpr et -qnofdpr
L'option -qfdpr construit au cours de l'exécution du programme cible un fichier objet avec des informations que l'utilitaire fdpr utilise pour optimiser le fichier exécutable. Son usage ne garantit toutefois pas l'obtention de meilleures performances ou des résultats strictement identiques.Seuls les sous-programmes compilés avec cette option vont profiter de l'optimisation. Son usage est similaire à celui de l'option -qpdf. On peut aussi consulter la manpage de fdpr. L'option par défaut est -qnofdpr. Retour au début de la section .
8. Options -qhot[=suboptions] et -qnohot
L'option -qhot a plusieurs actions ; elle permet notamment d'effectuer ou non des transformations sur les boucles et les fonctions intrinsèques tableaux durant l'optimisation. Elle décide ou non d'affectuer du padding sur les variables pour éviter des cache misses (défauts de cache). Les arguments sont :- arraypad : le compilateur va effectuer du padding (décalage à sa convenance) sur les tableaux pour lesquels un gain peut être obtenu. Tous les tableaux ne seront pas obligatoirement affectés et d'un tableau à l'autre, le décalage peut varier ;
- arraypad=n : le compilateur va effectuer du padding sur tous les tableaux du programme avec le même décalage. Il est alors souhaitable de prendre pour n un multiple de la plus grande taille d'éléments de tableau (6, 8 ou 16) ;
- vector et novector : le compilateur convertit certaines opérations effectuées dans une boucle sur des éléments consécutifs d'un tableau (racine carrée, ...) en un appel à une routine présente dans la librairie libxlopt.a. Cet appel va effectuer plusieurs calculs à la fois (chevauchement), ce qui est plus rapide que de les effectuer à la suite.
En mettant -qhot=novector, le compilateur effectue des transformations sur les boucles et les fonctions sur les tableaux mais ne fait pas les appels aux routines "vectorielles".
L'option -qhot=vector peut modifier la précision des résultats du programme de manière inacceptable, on peut alors mettre les options-qhot=novector ou -qstrict pour y remédier.
les deux arguments arraypad et arraypad=n doivent être utilisés avec précaution car il n'y a pas de vérification en cas de reshaping (fonction reshape) ou d'équivalence et un plantage du programme peut alors survenir. L'argument -qhot=vector est la sous-option par défaut lorsque l'on spécifie l'une des options : -qhot, -qsmp, -O4 ou -O5 (voir ci-dessous). L'option par défaut est -qnohot. Retour au début de la section .
9. Option -qipa[=suboptions]
L'option -qipa renforce l'optimisation en effectuant une analyse détaillée entre les procédures (IPA : interprocedural analysis, soit analyse inter-procédurale).L'option -qipa nécessite la présence d'un niveau d'optimisation parmi -O, -O2, -O3, -O4 ou -O5. Pour une possible amélioration, on peut aussi spécifier l'option -Q (voir ci-dessus). L'option -qipa étend la portée de l'analyse durant les phases d'optimisation et d'inlining d'une seule procédure à de multiples procédures (même placées dans des fichiers différents) et l'édition des liens entre-elles. L'utilisation de l'analyse interprocédurale se fait en deux étapes :
- on effectue l'analyse de performance avant l'utilisation de l'option -qipa ;
- on spécifie l'option -qipa à la compilation et à l'édition des liens.
Durant la compilation, le compilateur stocke les informations de l'analyse interprocédurale dans le fichier objet, extension .o. Durant l'édition des liens l'option -qipa effectue une ré-optimisation complète de l'application (dans son intégralité) .
- inline=auto|noauto : spécifie ou pas l'inlining automatique ;
- inline=procedure-names : spécifie une liste de routines que l'éditeur de liens doit essayer d'inliner ;
- level=lev : spécifie le niveau de l'étude, 0 (analyse et optimisations minimales), 1 (activation de l'aliasing et étude limitée) et 2 (analyse interprocédurale complète) ; ce dernier est mis en place par le niveau d'optimisation -O5 ;
- list=[filename|short|long] : spécifie un nom de fichier (a.lst est le nom par défaut) pour le rapport d'analyse ainsi que l'importance du rapport ;
- noinline=procedure-names : spécifie une liste de routines qui ne doivent pas être inlinées.
- pdfname=filename : spécifie le nom du fichier d'informations pour le profile-directed feedback (pdf).
10. Options -qlargepage et -qnolargepage
L'option -qlargepage indique au compilateur que le programme compilé peut améliorer ses performances en utilisant les pages mémoire de 16 Mo (au lieu de 4 ko standard). Cette option peut être utile pour les programmes qui brassent un gros volume mémoire de données.
L'option par défaut est -qlargepage (modification CRIHAN). Retour au début de la section .
11. Option -qpdf{1|2}
L'option -qpdf active les optimisations au travers du profile-directed feedback (pdf) qui permet d'améliorer les performances des programmes au voisinage des branchements en se basant sur le retour d'exécutions test. L'utilisation de l'analyse interprocédurale se fait en trois étapes :- on compile les fichiers source souhaitées avec l'option -qpdf1 et un niveau d'optimisation minimal (-O3, -O4 voire -O5 plutôt que -O2) ;
- on exécute le programme avec un jeu de données représentatif. On peut effexctuer plusieurs exécutions consécutives, les informations sont accumulées ;
- on effectue la compilation des routines avec l'option -qpdf2 au lieu de -qpdf1. Il est important que toutes les autres options soient les mêmes pour les sous-programmes concernés. Dans cette seconde phase, les informations collectées sont employées pour affiner les optimisations.
il faut s'assurer que la variable d'environnement PDFDIR correspond à un chemin absolu sous peine d'échec de la procédure, c'est le répertoire courant si elle n'est pas initialisée.
Ces optimisations doivent avoir lieu après le déboguage et toutes les autres optimisations.
On peut utiliser l'option -qipa=pdfname=filename pour spécifier différents noms de fichier d'informations.
La première phase (-qpdf1) s'accompagne d'une légère dégradation des performances qui disparait lors de la troisième (-qpdf2). Retour au début de la section .
12. Options -qsmp et -qnosmp
L'option -qsmp indique que le code généré est produit pour un systè SMP ( Symmetric Multiprocessors).Avec cette option, le compilateur reconnait les directives SMP$, !$OMP et IBMP.
Il est important d'utiliser alors un compilateur qui soit thread safe, pour les phases de compilation et d'édition de liens, il s'agit de xlc_r et xlC_r.
L'option -qsmp dispose de plusieurs arguments :
- auto (défaut) | noauto : cette sous-option contrôle la parallélisation automatique (à éviter). Par défaut, le compilateur va essayer de paralléliser chaque boucle explicite for ainsi que celles générées par le compilateur lorsqu'il traite les fonctions tableaux intrinsèques. L'argument noauto désactive la parallélisation automatique et seules les constructions qui sont explicitement signalées, sont parallélisées. La sous-option omp implique ce dernier argument.
- nested_par | nonested_par(défaut) : avec cette sous-option, le compilateur parallélise les boucles imbriquées (en fait il sérialise la boucle interne). Cet argument n'est pas conforme à l'API C d'OpenMP.
- omp | noomp(défaut) : le compilateur traite le code en respectant l'API C d'OpenMP. Cela implique : désactivation de la parallélisation automatique, la seule directive reconnue est !$OMP (on peut en ajouter d'autres avec l'option -qdirective).
- opt | noopt(défaut) : si l'option -qsmp=noopt est spécifiée, alors le compilateur va effectuer le travail d'optimisation minimal nécessaire pour paralléliser le code. C'est utile en phase de déboguage en complément de l'option -g.
- schedule =options : on peut définir la manière dont les itérations vont être partagées entre les différentes threads au sein des régions parallèeles. On a le choix entre :
- affinity[=n] : les itérations sont partagées en autant de partitions qu'il y a de threads, chacune d'elle étant initialement assignée à une thread avant d'être ensuite subdivisée en paquets de n ;
- dynamic[=n] : les itérations sont directement partagées en paquets de n itérations. L'attribution est faite en suivant la règle du "premier arrivé, premier servi" ;
- guided[=n] : les itérations sont distribuées en groupes de plus en plus petit jusqu'à atteindre n itérations ;
- runtime : le choix est fait à l'exécution, par exemple à l'aide d'une variable d'environnement ;
- static[=n] : les itérations sont partagées en groupe de n itérations, qui sont distribuées en "round robin" ;
- threshold =n : elle contrôle le niveau de parallélisation automatique qui a lieu, où n sert de "seuil" minimal pour effectuer ou non ce travail.
13. Options -qstrict et -qnostrict
L'option -qstrict vérifie que les optimisations effectuées par les options -qhot, -O3 et -qipa n'altèrent pas la sémantique des programmes C.Elle est utile si l'augmentation du niveau d'optimisation entraine l'apparition de différences avec les résultats obtenus par des codes non optimisés. Ces différences peuvent avoir pour origine l'utilisation de l'associativité de la multiplication ou de l'addition, l'apparition et le traitement d'exceptions, ... L'option par défaut est -qnostrict. Retour au début de la section .
14. Option -qthreaded
Cette option indique au compilateur qu'il doit générer un code thread safe.Cette option est activée par défaut par les commandes xlc_r, xlC_r. Retour au début de la section .
15. Option -qtune=implementation
Cette option contrôle le choix des instructions, des améliorations de performance qui dépendent de l'architecture d'exécution. Cela concerne l'utilisation des caches, le pipelining des opérations, ce qui profite surtout aux programmes faisant beaucoup d'opérations en virgule flottante.Lorsque l'on optimise un code, il faut spécifier cette option avec l'attribut pwr4 pour les plateformes à base de processeurs Power4 ou pwr5 pour les plateformes à base de processeurs Power5.
Les codes compilés et optimisés pour les power5 peuvent ne pas s'exécuter sur les Power4. Il est donc important d'y penser avant. Retour au début de la section .
16. Options -qunroll[=auto|yes] et -qnounroll
Ces options spécifient si le compilateur a le droit ou pas de dérouler les boucles for (unrolling).Cela ne s'applique qu'aux boucles internes, i.e. celles qui ne contiennent aucune autre boucle. L'option -qunroll peut être dotée d'un argument parmi les deux suivants :
- auto : le compilateur effectue les opérations basiques d'unrolling. C'est le niveau par défaut si -qunroll n'est pas spécifiée dans la commande de compilation ;
- yes : le compilateur effectue une recherche approfondie pour dérouler les boucles. C'est le niveau par défaut si -qunroll est spécifiée.
La présence de cette option ne garantit pas l'unrolling des boucles ; en effet le compilateur cherche à déterminer si cela est profitable ou non au programme.
Il est parfois judicieux de dérouler les boucles externes pour plus d'efficacité. Ce travail n'est pas effectué par le compilateur, il doit être fait à la main.
La page des conseils pratique fournit quelques exemples.
17. Option -qfloat=options
Cette option contrôle le traitement de cas particuliers en arithmétique flottante.Elle possède un certain nombre d'arguments avec des valeurs par défaut qui sont : noflint, fold, nohsflt, nohssngl, maf, nonans, norndsngl, norrm, norsqrt, et nostrictnmaf. Ils sont décrits ci-dessous :
- flint | noflint (défaut) : optimisation plus sûre que hsflt en arrondissant les valeurs double précision seulement quand elles sont stockées dans des zones mémoire simple précision (REAL(4), e.g.). Cet argument est activé par le niveau -O3 sauf si -qstrict est présent ;
- fold (défaut) | nofold : évaluation des expressions flottantes constantes lors de la compilation ;
- hsflt | nohsflt (défaut) : optimisation qui empêche certais arrondis pour les valeurs simples précision et remplace les divisions par des multiplications par l'inverse du dénominateur. Par orécaution, il est conseillé d'évitée pour des calculs en simple précision ;
- hssngl | nohssngl (défaut) : optimisation plus sûre que hsflt en arrondissant en simple précision les expressions seulement quand elles sont stockées dans des zones mémoire simple précision (REAL(4), e.g.) ;
- maf (défaut) | nomaf : calculs flottants plus performants dans le cas de multiplication / addition enchainées (MAF). L'ordre des opérations peut alors être différent, ce qui peut modifier les résultats (non respect possible de la norme IEEE) ;
- nans | nonans (défaut) : détection des opérations utilisant les NaNs (le "s" est obligatoire, ce sont des NaNs souhaités) et les NaNs peuvent alors être tracés durant l'exécution avec -qflttrap=invalid:enable ;
- rndsngl | norndsngl (défaut) : arrondi du résultat de chaque opération en simple précision (REAL(4), e.g.). Cela peut être utile dans le portage de programmes venant d'architecture basé sur le PowerPC ;
- rrm | norrm (défaut) : désactivation des optimisations qui nécessitent le mode d'arrondi "arrondi au plus proche". C'est utile si le programme contrôle le mode d'arrondi en cours d'exécution (non respect possible de la norme IEEE) ;
- rsqrt | norsqrt (défaut) : calcul plus performant de l'opération division par une racine carrée en la remplaçant par la multiplication par l'inverse de la racine carrée. Cet argument est activé par le niveau -O3 sauf si -qstrict est présent ;
- strictnmaf | nostrictnmaf (défaut) : désactivation des transformations qui introduisent des MAF négatives car elle ne préservent pas le signe de la valeur zéro. (MAF = Multiply and Add Fused : multiplication / addition enchainées). Pour un respect strict de la sémantique du programme il faut utiliser les deux options -qstrict et -qfloat=strictnmaf ;
18. Proposition d'options d'optimisation
On a le choix entre plusieurs niveaux d'optimisation qui influent plus ou moins fortement sur la précision des résultats numériques : le programme s'exécute plus vite mais on perd de la précision par rapport aux résultats de référence (obtenus sans optimisation). Il faut donc s'arrêter au "bon" niveau.On peut ainsi tester plusieurs configurations, proposées ci-dessous, par niveau croissant d'optimisation :
| 1. | -O2 | -qarch=auto -qtune=auto -qmaxmem=-1 | ||
| 2. | -O3 | -qstrict | -qarch=auto -qtune=auto | |
| 3. | -O3 | -qarch=auto -qtune=auto | ||
| 4. | -qhot | -O3 | -qarch=auto -qtune=auto | |
| 5. | -qhot | -O3 | -qipa | -qarch=auto -qtune=auto |
Des options pour l'édition des liens
L'édition des liens consiste à créer un fichier exécutable à partir des fichiers objets des différents sous-programmes, de librairies, etc ...
Sauf en présence de l'option -c, xlc appelle l'éditeur de liens standard ld et lui transmet les arguments de la séquence de compilation qui ne sont pas reconnus par lui-même.
1. Option -b64
Cette option indique au linker qu'il doit créer un exécutable travaillant avec un espace d'adressage sur 64 bits. Retour au début de la rubrique.
2. Options -bmaxdata:bytes et -bmaxstack:bytes
Ces options spécifient l'espace maximal de mémoire attribué d'une part pour le tas (heap, les "données") et d'autre part pour la pile (stack, les "variables locales").
Sur les systèmes AIX, le heap peut prendre jusqu'à 8 segments de 256 Mo, soit 0x80000000 (en hexadécimal).
Sur les systèmes AIX, la stack peut occuper 1 segment de 256 Mo, soit 0x10000000 (en hexadécimal).
Attention !! : si vous employez ces options pour faire l'édition de liens de programmes soumis à LoadLeveler, il faut que la demande en mémoire corresponde aux valeurs utilisées pour renseigner ces deux options.
De plus, elles ne doivent pas être employées pour des programmes compilés en 64 bits. Retour au début de la rubrique.
3. Options -Ldir et -lkey
Ces options permettent de préciser d'une part un chemin supplémentaire pour chercher une librairie et d'autre part le nom de la librairie (par défaut : libkey.a). Retour au début de la rubrique.4. Option -brename:.name,.name_
Cette option permet de modifier le nom de l'objet appelé lors de l'édition des liens. Cela est utile pour les sous-programmes qui ont ou non pas un "underscore" à la fin de leur nom ; par exemple -brename:.flush,.flush_.
Remarque :
un inconvénient non négligeable est la présence obligatoire d'au moins une occurrence à traiter si cette option est spécifiée. Dans le cas contraire une erreur survient qui provoque l'arrêt de l'édition de liens.
5. Option -bloadname:name
Cette option permet de sauvegarder dans le fichier de nom name un compte-rendu des actions de l'éditeur de liens. Retour au début de la rubrique.
6. Option -blpdata
Cette option permet de demander des large pages mémoire (16 Mo au lieu de 4 ko) pour les applications qui brassent un gros volume mémoire de données. Cela permet de se limiter à l'édition des liens plutôt que de refaire toute la compilation.Les large pages peuvent améliorer les performances des applications consommatrices de bande passante mémoire de l'ordre de 20 %.
Attention :
les noeuds p575 à base de Power 5 et les p690 à base de Power 4 sont tous configurés avec de la mémoire en Large Pages. Cette option est donc mise par défaut par le compilateur dès lors que vous compilez vos programmes sur les machines du CRIHAN.
7. Proposition d'options pour l'édition de liens
L'option -blpdata étant mise par défaut, il n'y a pas d'option particulière. contactez le support si nécessaire. Voir aussi la rubrique Exemples de fichiers de compilationExemples de fichiers de compilation Makefile
Le passage du code source à l'exécutable se déroule en plusieurs étapes et dépend des options de compilation insérées dans le fichier de compilation Makefile. Il s'agit d'un fichier de description contenant des informations sur les dépendances entre les fichiers et les commandes à exécuter pour mettre à jour les cibles (targets) selon les modifications des fichiers dont elles dépendent. La compilation est lancée en tapant make target avec la cible voulue. Outre la manpage de make, ce fichier est un descriptif de la syntaxe propre au Makefile.Les exemples donnés ci-dessous sont destinées à des programmes écrits en C.
Chaque fichier Makefile contient des options conseillées pour le déboguage, pour l'optimisation, etc ...
Il est bien sûr possible de les compléter avec des options pour le profilage, le backfeeding, etc ...
1. Programme séquentiel
Il n'y a pas d'option spécifique. Fichier Makefile programme séquentiel pour architecture Power4 (p690)Fichier Makefile programme séquentiel pour architecture Power5 (p575)
2. Programme parallèle MPI
Le compilateur n'est plus xlc mais mpxlc.Le préfixe mp signifie que le compilateur définit les chemins pour chercher les fichiers et bibliothèques spécifiques à MPI (Messages Passing Interface). Fichier Makefile programme parallèle MPI pour architecture Power4 (p690)
Fichier Makefile programme parallèle MPI pour architecture Power5 (p575)
3. Programme parallèle OpenMP
Le compilateur n'est plus xlc mais xlc_r.L'extension _r signifie que le compilateur supporte les threads selon la norme POSIX qui sont par exemple employées pour la parallélisation par OpenMP et qu'il est aussi threadsafe . Fichier Makefile programme parallèle OpenMP pour architecture Power4 (p690)
Fichier Makefile programme parallèle OpenMP pour architecture Power5 (p575) Retour au début de la section .
Messages d'erreur de l'éditeur de liens
Lorsque l'éditeur de liens rencontre un problème il génère un message d'erreurs. Cette page reprend les messages les plus couramment rencontrés qui nécessitent quelques explications.
ld: 0711-317 ERROR: Undefined symbol: .pmm2
Séquence de compilation :
xlc pmm1.o main.o -o pmm.out
ld: 0711-317 ERROR: Undefined symbol: .pmm2
ld: 0711-344 See the loadmap file main for more information.
Lors de l'édition des liens, le compilateur xlc appelle automatiquement ld. Celui-ci a trouvé un symbole qui n'est ni une variable ni un sous-programme d'une librairie référencée.
Pour avoir des informations complémentaire sur l'origine de ce symbole, on ajoute l'option -bloadmap avec le nom du symbole comme argument :
xlc pmm1.o main.o -o pmm.out -bloadmap:pmm2
La même erreur survient mais le fichier pmm2 est crée et son contenu est le suivant :
ld: 0711-318 ERROR: Undefined symbols were found.
The following symbols are in error:
Symbol Inpndx TY CL Source-File(Object-File) OR Import-File{Shared-object}
RLD: Address Section Rld-type Referencing Symbol
----------------------------------------------------------------------------------------------
.pmm2 [61] ER PR test1.c(test1.o)
00000794 .text R_RBR [12] .main
ER: The return code is 8.
Cela indique que le symbole est référencé dans la routine qui s'appelle main.
Retour au début de la section .Les listings produits par le compilateur
L'information produite par le compilateur est placée dans le listing produit par les options -qlist, -qsource, -qxref, -qattr, -qreport et -qlistopt.
Pour localiser l'origine d'un problème à l'aide du listing, on peut se référer à :
- la source section : obtenir les erreurs de compilation insérées précisément dans le code source ;
- la attribute and cross-reference section : trouver les objets avec des erreurs dans les noms, ou utilisés sans être déclarées ou avec des incohérences dans les séquences d'appels ;
- les transformation et object sections : voir si le code généré est conforme à ce que l'on attend.
1. Header section
Tout fichier listing a une en-tête qui contient les éléments suivants :- l'identifiant du compilateur, basé sur les données suivantes :
- le nom du compilateur,
- le numéro de version,
- le numéro de release,
- le numéro de modification,
- le numéro de fix.
- le nom du fichier source,
- la date de la compilation,
- l'heure de la compilation.
2. Options section
La section des options est toujours présente dans un fichier listing. Il y a une section différente pour chaque unité compilée. Elle indique les options actives pour cette unité. Cette information est utile lorsque l'on a des conflits d'options.L'option -qlistopt affiche l'état de toutes les options. Retour au début de la section .
3. Source section
La section source contient les lignes de code avec un numéro de ligne, ainsi qu'éventuellement un numéro de fichier. Ce numéro de fichier indique le fichier source (ou le fichier inclus) qui contient la ligne source.Toutes les lignes du fichier source principal (i.e. celles qui ne font pas partie de fichiers inclus) n'ont pas de numéro de fichier. Chaque fichier inclus possède un numéro de fichier et les lignes source de ces fichiers sont affichées avec ce numéro de fichier.
L'affichage, de gauche à droite, est le suivant : numéro de fichier, numéro de ligne, le texte de la ligne source.
La numérotation des lignes est relative à chaque fichier.
Les lignes source et les numéros qui leur sont associés n'apparaissent que si l'option de compilation -qsource est présente.
Messages d'erreur
Si l'option -qsource est présente, alors les messages d'erreur sont insérées précisément dans le listing du code source. Les messages inclus sont composés de :- la ligne du code source ;
- une ligne de caractères qui pointe vers les colonnes en erreur ;
- le message d'erreur avec :
- le code à 4 chiffres qui identifie le produit ;
- le numéro du message d'erreur ;
- le niveau de sévérité du message ;
- le texte qui décrit l'erreur.
4. Transformation report section
Si l'option -qreport fait partie de la séquence de compilation, alors un compte-rendu des transformations effectuées par xlc est présent dans le listing. Il s'agit de pseudo-code qui correspond au code source original et on peut ainsi voir les transformations liées à la parallélisation et aux transformations de boucles que les options -qhot et -qsmp ont générées. Retour au début de la section .
5. Attribute and cross-reference section
Cette section fournit des informations sur les entités manipulées dans l'unité de compilation. Elle est présente si l'option -qxref ou l'option -qattr est activée. Selon l'option activée, cette section contient une partie ou l'intégralité des informations suivantes sur les entités manipulées dans l'unité de compilation.- nom des entités ;
- attribut des entités (si l'option -qattr est activée). Dans ce cas, on a tout ou une partie des informations suivantes : le type (voir ci-dessous), la classe du nom (voir ci-dessous), l'adresse relative du nom, l'alignement, les dimensions, le caractère allocatable pour un tableau, si c'est une variable pointeur ou pointée, ... ;
- des coordonnées (lignes.colonnes) qui indiquent si l'entité est définie, rérencée ou modifiée. Le tableau suivant reprend les différents symboles :
Si l'entité est simplement référencée alors les coordonn&eacut;es ne sont pas écrites.Symbole Signification $ l'entité est déclarée * l'entité est définie & l'entité est déclarée et définie @ l'entité reçoit une affectation
La classe est une séquence de qualificatifs parmi : automatic, common block, external subprogram, function, intrinsic, module, static, value parameter, ...
le type est le type de variable standard C : int, float, ... L'argument full permet d'avoir l'affichage pour toutes les entités et non pas uniquement celles qui sont utilisées.
Retour au début de la section .
6. Object section
Cette section n'est présente que si l'option -qlist est transmise à xlc. Elle donne, pour chaque ligne du code source, l'offset de l'instruction en hexadécimal, le mnémonique assembleur de l'instruction ainsi que des informations liées aux nombres de cycles horloge que cela représente.Chaque unité de compilation possède sa propre section objet. Retour au début de la section .
7. File Table section
Cette section contient une table qui donne le numéro et le nom de chaque fichier source et de chaque fichier inclus utilisé. Elle fournit aussi le numéro de la ligne du fichier source principal dans laquelle le fichier inclus est référencé. Cette section est toujours présente. Retour au début de la section .
8. Compilation Unit Epilogue section
C'est la dernière partie du listing de chaque unité de compilation. Elle contient un résumé et le résultat de la compilation. Cette section n'est pas présente si le fichier compilé ne contient qu'une seule unité de compilation. Retour au début de la section .