Efficient Code Generation for Automatic Parallelization and Efficient Code Generation for Automatic Parallelization and Optimization Cédric Bastoul Proposé par : Albert Cohen Présenté par : L.Landwerlin, J.Rahmé, M.Thiam Efficient Code Generation for Automatic Parallelization and Optimization
Intérêt Code efficace Génération automatique Processeurs complexes pipelines MMX (Matrix Math eXtention), SSE (Streaming SIMD Extensions), Altivec, ... ... Génération automatique Langages de programmation ne permettant pas l'accès à ces fonctionnalitées Opération pénible Dépendant du matériel
Plan Introduction Représentation polyédrique Schéma de génération Travaux antérieurs Génération 1.Algorithme de génération de code 2.Problèmes de génération IV.Expérimentations Implémentation Résultats V.Conclusion
Représentation polyèdrique Un polyèdre est un solide délimité par des faces polygonales. Représentation d'une classe de boucles (for/while) “nids de boucles” par des -polyèdres paramètrés
Représentation polyèdrique int i, j; for (i = 1 ; i < n ; i++) for (j = 1 ; j < n ; j++) if (i <= -j + n + 2) I1;
Représentation polyèdrique Condition de modélisation par un polyèdre : limites et conditions doivent déprendre de : compteur d'une boucle englobante constante paramètres formels SCoP (Static Control Part)
Représentation polyèdrique int i, j; for (i = 1 ; i < n ; i++) for (j = 1 ; j < n ; j++) if (i <= -j + n + 2) I1;
Schéma de génération Trouver Générer un nouvel Optimisations du code Analyser Générer du code réordonnancé Optimisations locales Code Code optimisé Trouver un nouvel ordre d'exécution
Travaux antérieurs Méthode de Quilleré et al. - Donne de bons résultats quand il faut générer un code pour plusieurs polyèdres - Possède plusieurs limitations : - la complexité - Génération de code avec pas unitaire seulement - Code non optimisé
Plan Introduction Représentation polyédrique Schéma de génération Travaux antérieurs Génération 1.Algorithme de génération de code 2.Problèmes de génération IV.Expérimentations Implémentation Résultats V.Conclusion
Algorithme de génération de code (1) Contexte Dimension Boucles imbriqués Entrées Sortie Liste des polyèdres - Liste des polyèdres transformés : - Contexte : l’ensemble des contraintes sur les paramètres globaux - Boucles imbriqués : qui implémentent l’ordre d’exécution de la fonction de ré-ordonnancement
Algorithme de génération de code (2) Figure 1 Figure 2 Le polyèdre transformé de S1 qu’on doit parcourir Le polyèdre transformé de S2 qu’on doit parcourir
Algorithme de génération du code (3) S1 et S2 S1 do i = 1 6 (pas = 2) do i = 7 n (pas = 2) do i = 1 6 (pas = 2) do j = 1 7-i S1 S2 Etapes : do j = 8-i n S1 -Séparer les projections en polyèdres disjoints do i = 7 n (pas = 2) -Génération du code de parcours pour ‘i’ do j = 1 n S1 -Génération des boucles imbriqués
Boucles à pas non unitaires (1) Polyèdre de départ Transformation : fonction de transformation ayant pour matrice T = [1 2] Il peut être parfois nécessaire de ne pas parcourir certaines valeurs dans certaines dimensions Problème survient : quand T est non uni-modulaire (dét ≠ 1 ) Les Trous : points avec des images rationnelles dans l’espace d’origine Efficient Code Generation for Automatic Parallelization and Optimization
Boucles à pas non unitaires (2) Transformation en utilisant l’algorithme modifié par les auteurs Algorithme initial Algorithme modifié par les auteurs
Indépendance des degrés(1) Définition Indépendance entre les compteurs utilisés par les instructions considérées ou à exécuter. Exemple 4 matrices A, B, C, D dans M[n,n]. On doit calculer E= A x B & F= C x D
Indépendance des degrés(2) Exemple (suite1) pour t=1 à n Pour i=1 à n Pour j=1 à n E[i,j] += A[i,t] * B[t,j] F[i,j] += C[i,t] * D[t,j] Itérations: 2n3 + 2n2 + n Exemple (suite2) pour t=1 à n Pour i=1 à n Pour j=1 à n E[i,j] += A[i,t] * B[t,j] F[i,j] += C[i,t] * D[t,j] Itérations: 2n3 + n2 + n
Indépendance des degrés (3) Exemple (Fin) pour t=1 à n Pour i=1 à n Pour j=1 à n E[i,j] += A[i,t] * B[t,j] F[i,j] += C[i,t] * D[t,j] Itérations: n3 + n2 + n
Plan Introduction Représentation polyédrique Schéma de génération Travaux antérieurs Génération 1.Algorithme de génération de code 2.Problèmes de génération IV.Expérimentations Implémentation Résultats V.Conclusion
Implantation Sous le nom CLooG (Chunky Loop Generator) Disponible sous licence GNU à (http://www.prism.uvsq.fr) Applicable à plusieurs systèmes Avoir au préalable PIP/PipLib
Tests Résultats Infos générales sur les données d’entrée infos sur la forme des polyèdres Résultats
Résultats(1) Génération de code initial suboptimal dupliqué temps Apsi Art Lucas Quake 2192 1 9118 58 499 0 623 2 2070 1 6832 127 639 0 740 8 Comparaison entre ces deux colonnes nous donne un facteur de duplication de l’ordre de 3.4
Résultats(2) Résultats encourageants Utilisation de la mémoire acceptable De même que le temps de génération du CC Autres expériences montrent son efficacité ~10 polyèdres Sans explosion Mémoire Temps
Conclusion Compilation : Optimisation, Parallélisme Solution plusieurs méthodes(naïve, étude des polyèdres 1 à 1, …) meilleure méthode : polyèdre (Quilleri et al.) Apports de l’article Modèle de transformation générale Matrices quelconques, Pas non unitaires Fonctions de parcours non entière Montrer que la méthode donne des résultats optimaux avec des problèmes réels Perspectives Chevauchement des polyèdres complexité