Optimisation et parallélisation de code pour processeur à instructions SIMD multimedia François Ferrand Plan Introduction • Extensions multimédia pour processeur à usage universel • SAC: SIMD Architecture Compiler • Algorithme de vectorisation • Conclusion et perspectives Évolution des moeurs • Nouvelles applications – Multimédia, jeux vidéos, … • Importante puissance de calcul nécessaire même pour les applications personnelles • Architectures de processeur conçues pour les applications d’il y a 10 ans Une solution: les extensions multimédia • Bon marché • Bonnes performances sur certaines applications (de 2x a 16x) • Disponible sur toutes les plateformes • Problèmes: – Compliqué à utiliser – Pas d’optimisation par le compilateur Plan Introduction Extensions multimédia pour processeur à usage universel • SAC: SIMD Architecture Compiler • Algorithme de vectorisation • Conclusion et perspectives Extensions multimédia • Introduites dans les années 90 • Disponibles sur toutes les architectures: • MMX, SSE et SSE2 sur Intel, VIS sur SUN, … • Instructions supplémentaires, spécifiques aux applications multimédia • Peuvent en fait être utilisées dans de nombreux domaines: • Télécommunications, traitement du signal, calcul scientifique… Opérations SIMD • « Single Instruction stream, Multiple Data stream » • Effectuent la même opération sur plusieurs éléments en même temps • Types de données plus petits (8 ou 16 bits) « Packed Data Types » • Plusieurs éléments dans un seul registre • Registre de 64 ou 128 bits – Utilisation des registres entiers, flottants, ou de registres spécifiques • Éléments de base: – Entier sur 8, 16 ou 32 bits – Virgule flottante sur 64 bits Utilisation ? • Codage assembleur • Codage en C de bas niveau • Templates C++ • Librairies spécialisées, déjà optimisées • Génération automatique par le compilateur ? Plan Introduction Extensions multimédia pour processeur à usage universel SAC: SIMD Architecture Compiler • Algorithme de vectorisation • Conclusion et perspectives Présentation de SAC • Utilise la plateforme PIPS • Compilateur source vers source Fortran • Génération de pseudo fonctions pour les instructions multimédia • Fonctionnement: Application successive de plusieurs phases Etapes • Préparation du code Atomiseur Déroulage de boucles Elimination des réductions Assignement unique • Vectorisation Atomiseur • Transforme le code pour utiliser des opérations simples, « atomiques » t1 b c a f (b c d ) t 2 t1 d a f (t 2 ) Déroulage de boucles • Rends le parallélisme apparent • Nécessite le calcul du facteur de déroulage For i=0 to n A[i] = B[i] + C[i] End For For i=0 to n step 4 A[i] = B[i] + C[i] A[i+1] = B[i+1] + C[i+1] A[i+2] = B[i+2] + C[i+2] A[i+3] = B[i+3] + C[i+3] End For Élimination des réductions • Réduction: x f ( x, ) • Réductions incompatibles avec la vectorisation • Remplacement de la variable de réduction par un vecteur de réduction For i=0 to n step 2 S = S + A[i] S = S + A[i+1] End For tS[0] = tS[1] = 0 For i=0 to n step 2 tS[0] = tS[0] + A[i] tS[1] = tS[1] + A[i+1] End For S = S + tS[0] + tS[1] Assignement unique • Elimine les « fausses » dépendances • Les variables sont renommées, avec un nom différent par assignation t = B[i] * C[i] A[i] = t + D[i] t1 = B[i] * C[i] A[i] = t1 + D[i] t = B[i+1] * C[i+1] A[i+1] = t + D[i+1] t2 = B[i+1] * C[i+1] A[i+1] = t2 + D[i+1] Plan Introduction Extensions multimédia pour processeur à usage universel SAC: SIMD Architecture Compiler Algorithme de vectorisation • Conclusion et perspectives Principe de la vectorisation • Générer des instructions SIMD à partir des instructions originales • Simple grâce aux transformations précédentes • Suffisant de transformer les sequences Regroupage des instructions • Algorithme glouton • Regroupe les instructions du même type • Une instruction est ajoutée à un groupe si: • Elle est de même type • Il n’y a pas de dépendance avec les autres instructions du groupe • L’instruction peut être déplacée a la fin du groupe Analyse des groupes • Sélection des opcodes utilisés pour implanter un groupe • Information sur les instructions SIMD à générer • Création de vecteurs SIMD pour chacune des instructions SIMD • Analyse des dépendance entre ces vecteurs Generation du code • Pour chaque instruction SIMD, on genere: • Des instructions pour charger les vecteurs SIMD • Une instruction pour executer l’operation • Une instruction pour sauvegarder le vecteur SIMD contenant le resultat For i=0 to n step 2 A[i] = B[i] + C[i] A[i+1] = B[i+1] + C[i+1] End For For i=0 to n step 2 vecB = {B[i], B[i+1]} vecC = {C[i], C[i+1]} vecA = vecB + vecC {A[i], A[i+1]} = vecA End For Optimisation • Chargement optimisé: • Réutilisation de vecteurs si possible • Utilisation d’autres instructions pour ne pas effectuer un accès mémoire (shuffle, pack, …) • Chargement de données contiguës/constantes • Sauvegardes inutiles éliminées par use-def elimination Plan Introduction Extensions multimédia pour processeur à usage universel SAC: SIMD Architecture Compiler Algorithme de vectorisation Conclusion et perspectives Conclusion • Extensions multimédia très puissantes, mais sous-utilisées • SAC permet une vectorisation automatique Facile d’utilisation Rapide Performant Perspectives • Support du C dans PIPS • Exploiter les spécificités des jeux d’instructions ? • Arithmétique saturée, instructions spécifiques… • Optimisations de plus haut niveau ? • Réorganisation des données à l’exécution, en fonction des motifs d’accès…