17-21 Octobre 2005 Formation Continue - CNRS Laurence Viry Analyse et Optimisation de code Techniques doptimisation
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry A faire Vérifier: Multi-threading bib sun (F roch) Utilisation des caches L3
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Optimisation séquentielle Principes généraux Architecture des processeurs, évolution les 30 dernières années Architecture de la mémoire Quelques techniques doptimisations Méthodologie proposée Optimisation du compilateur Timing et profiling Quelques méthodes doptimisation manuelle
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Méthodologie conseillée Valider le programme à optimiser Utiliser des codes déja optimisés ou sy ramener Utiliser des algorithmes performants Analyser le code, et se concentrer sur les sections critiques Utiliser les capacités doptimiser du compilateur Effectuer des modifications dans le code pour optimiser les sections critiques
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Algorithmes Performants Les Mflops est un mauvais indice de performance dun code Deux algorithmes de multiplications de matrices Même Mflops Temps CPU très différents En priorité à loptimisation dun code, sassurer de la performance des algorithmes utilisés
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Techniques doptimisation Inlining Analyse interprocédurale Accès mémoire Réutilisation du cache Stride minimum Copie … Réduction des TLB misses Alignement des données Optimisation de boucles
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Compilateur: génération de code (rappel) 1ère phase: analyse syntaxique et logique Transformation en un code intermédiaire prêt à loptimisation 2ème phase: Optimisation Haut Niveau (HLO: transformations de boucles, inlining,..) 3ème phase: Optimisations globales et locales, allocation des registres… 4ème phase: Génération du code en tenant compte des spécificités de larchitecture du(des) processeurs.
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Software Pipelining Le compilateur ne fait pas toujours du Software Pipelining par défaut augmente le temps de compilation Performant sur les boucles vectorisables Moins performant sur les boucles: de grande taille contenant des récurrences Nest pas effectué sur les boucles: contenant des appels de fonction contenant des instructions goto
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Inlining Remplace lappel dune procédure par le code de cette procédure Intérets: élimine loverhead dû à lappel (sauvegarde des registres, appel, instructions de retour, …) fournit un contexte plus large pour loptimisation scalaire et de boucles.
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Inlining Inconvénients: Augmente le temps de compilation Crée des problèmes dallocation de registres plus complexes augmente la taille du code Critères dInlining: fréquence des appels taille de la procédure appelée
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Analyse Interprocédurale (IPA) Par défaut : analyse du compilateur sur une seule procédure à la fois. Inconvénients: manque dinformation pour analyser les dépendances, pour mettre en évidence les constantes mettre en évidence les variables jamais utilisées traitement des variables à la frontière des procédures... OPTIMISATION CONSERVATIVE
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry IPA (suite) Analyse plusieurs procédures simultanément Renvoie la plupart des actions doptimisation du compilateur juste avant lédition de liens Compilations en plusieurs phases Contrôle la façon dont les procédures et les fonctions interagissent ente elles Principales actions : Inlining automatique Désactive la récursivité...
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry IPA (suite) Intérets permet des optimisations supplémentaires Software Pipelining, Optimisation des boucles imbriquées, Inlining, réduction des conflits de cache(padding,…), élimination des fonctions jamais utilisées, détection des noms globaux, …
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry IPA (suite) Inconvénients: augmente le temps global compilation/édition de liens augmente la taille de lexécutable peut modifier sensiblement les résultats
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Optimisation des accès mémoire Minimiser le stride Fortran: stockage par colonne Parcourt dun tableau 2D par lindex le plus à gauche C : stockage par ligne Parcourt dun tableau 2D par lindex le plus à droite Regroupement de données Optimisation par copie Alignement « naturel » des données Optimisation des boucles
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Réutilisation du cache: stride Stride égal à 1 (Fortran) do i=1,n do j=1,n a(i,j)=b(i,j) enddo do j=1,n do i=1,n a(i,j)=b(i,j) enddo sera modifié
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Réutilisation du cache (suite) Regrouper les données utilisées do i,1,n j=index(i) d=d+sqrt(x(j)*x(j) + y(j)*y(j) + z(j)*z(j) enddo do i,1,n j=index(i) d=d+sqrt(r(1,j)*r(1,j) + r(2,j)*r(2,j) + r(3,j)*r(3,j) enddo x,y et z seront regroupés dans un même tableau r
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Optimisation du cache par copie Copie d une partie des données dans un tableau temporaire taille du tableau < 64*taille_page suffisamment petit: réutilisation des données du cache ne peut être pris en charge par le compilateur Performances: diminue les " TLB misses " " L1 et L2 misses " peuvent rester importants Overhead dû à la copie Préférer le " Cache Blocking " lorsque cest possible
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Recouvrement des latences daccès aux données Par le système pour les faibles latences: Caches primaires Caches secondaires data prefetch Pas intégrée aux langages C et Fortran Insérée automatiquement par le compilateur Manuellement par le programmeur à laide dune directive pour certains compilateurs
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Alignement des données Alignement « naturel »: lorsque ladresse est un multiple de la taille de la donnée Le compilateur effectue en général cet alignement. Mauvais alignement dans le cas de linstruction EQUiVALENCE et dans les COMMON en Fortran Conseils: Commencer par les données numériques de plus grande taille suivies par les non numériques Utiliser les options dalignement du compilateur …
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Optimisationde boucles Unrolling Boucles imbriquées Loop interchange Références mémoire Blocking Out-OF-Score
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Loop Unrolling Diminue loverhead dû à la gestion des boucles Favorise le parallélisme du processeur (pipelining) Mais nécessite une boucle de préconditionnement
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Les boucles candidates à lunrolling sont Un nombre « raisonnable » dinstructions à chaque itération Petit: overhead de la boucle de préconditionnement, sauf si le nombre ditérations est constant Nombre dinstructions par itération important augmente la taille du code et des accès mémoire Pas dappel de procédures Condition de branchement possible dans le cas de processeur superscalaire (exécution conditionnel) Boucle externe de boucles imbriquées dans certains cas
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Boucles imbriquées Unrolling : Boucle interne et/ou boucle externe ? stride => favoriser la réutilisation des caches Taille des boucles => favoriser les boucles à grand nombre d'itérations Traitement des boucles non récursives => augmente le taux de parallélisme:
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Loop Interchange Centrer lactivité sur les boucles les plus internes Minimiser le stride Nécessite une analyse de dépendance Par lutilisateur Par le compilateur Parallélisation automatique Paralléliser sur la boucle externe Unrolling sur la boucle interne
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Loop Interchange? DO I=1,N DO J=1,N A(J,I)=B(I,J) ENDDO DO J=1,N DO I=1,N A(J,I)=B(I,J) ENDDO Linversion des boucles ne résoud pas les problèmes daccès
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Cache Blocking Principes: minimiser les transferts utiliser entièrement la ligne de cache réutiliser au maximun les données dans le cache minimiser le nombre de références différentes à des pages physiques (TLB misses) Méthode découper les données en blocs tenant dans le cache ajouter des boucles extérieures qui contrôlent la taille des blocs Cas de la multiplication de grandes matrices: 2 matrices découpées en blocs colonnes 1 matrice en bloc ligne
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Algorithme de Gauss – DS20 / ES45 Influence de la taille du cache
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Cache Blocking Exemple: multiplication de deux matrices do j=1,n do i=1,m do k=1,p c(i,j)=c(i,j)+a(i,k)*b(k,j) enddo mnpldaldbldcScsMFLOPS
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Multiplication de matrices = Accès: Bloc C : 1fois Bloc A : nb colonnes de C Bloc B : nb lignes de A C A B
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Fusionner les boucles dimension a(n), b(n) do i=1,n a(i)=a(i)+alpha*b(i) enddo dot=0. do i=1,n dot=dot+a(i)*a(i) enddo dimension a(n), b(n) dot=0. do i=1,n a(i)=a(i)+alpha*b(i) dot=dot+a(i)*a(i) enddo
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry IEEE 754 binary floating point arithmetic Transformation non conforme avec IEEE 754 do i=1,n tmp=1/c b(i)=a(i)/c par do i=1,n enddo b(i)=a(i)*tmp enddo Lordre des opérations peut provoquer des résultats numériques différents (arrondis, overflows…) Lutilisation des resources hardware impose parfois de modifier lordre des opérations (pipelining…) Suivre le standard IEEE 754
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Optimisations Numériques Précision Architecture 32bits: ~7 décimales Architecture 64bits: ~13 décimales 128bits – options du compilateur: ~30décimales diminution des performances (~50%) utilité de cette précisions ? MADD instruction (ISA du processeur) Accélère les codes dalgèbre linéaire Nadhère pas totalement à la norme IEEE Perte de précision possible
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Les pointeurs Excellent outil pour construire et manipuler toute sorte de structure de données (listes, arbres,…) MAIS Inhibe certaines optimisations du compilateur par manque dinformation. ==> Optimisation conservative POURTANT Lutilisation de structures de données appropriées peuvent améliorer les performances de certaines applications
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Efficacité des Entrées/Sorties Utiliser autant que possible des fichiers non formattés Écrire la globalité dun tableau ou dune chaîne de caractères plutôt quélément par élément Écrire le tableau dans son ordre naturel Utiliser la technique de bufferisation pour minimiser le nombre dappels à des E/S Pour MPI, utiliser MPI-IO
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Méthodologie conseillée Validité du programme à optimiser Utiliser des codes déja optimisés ou sy ramener Utiliser des algorithmes performants Analyser le code, et se concentrer sur les sections critiques Utiliser les capacités doptimiser du compilateur Effectuer des modifications dans le code pour optimiser les sections critiques
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Utiliser des codes déja optimisés Bibliothèques constructeur HP/COMPAQ: CXML (DXML) IBM : ESSL SGI : SCSL SUN: Performance Library … Bibliothèques domaine public – portable BLAS (1 2 3) LAPACK: algèbre linéaire FFTW : transformée de Fourier ATLAS PETSC GOTO (BLAS) … Bibliothèques commerciales NAG IMSL
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Utiliser des codes déjà optimisés Serveur Alpha : ES45 CXML (Compaq Extended Math Library) et CXMLP (version parallèle SMP) versions optimisées des BLAS1, 2 et 3 (Basic Linear Algebra) FFT 1,2 et 3-D lapack (système linéaire et valeurs propres) solveurs de systèmes creux 2 versions: Une version séquentielle : libcxml.a Une version parallèle de type SMP : libcxmlp.a
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Utiliser des codes déjà optimisés SGI: ALTIX 350 SCSL () et SCSLXXX (version parallèle SMP) versions optimisées des BLAS1, 2 et 3 (Basic Linear Algebra) FFT 1,2 et 3-D lapack (système linéaire et valeurs propres) solveurs de systèmes creux... 2 versions: séquentielle et parallèle séquentielle : -lscs, –lscs_i8 parallèle (multi-thread): -lscs_mp, –lscs-i8_mp
17 – 21 Octobre 2005 Formation Continue - CNRS Laurence Viry Utiliser des codes déjà optimisés SUN: cluster de V40Z (quadri-procs) SUN Performance Library (version séquentielle) versions optimisées des BLAS1, 2 et 3 (Basic Linear Algebra) FFT 1,2 et 3-D lapack (système linéaire et valeurs propres) solveurs de systèmes creux... Utilisation -xlic_lib=sunperf parallèle (multi-thread à verifier ):