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 Vectorisation Atomiseur Déroulage de boucles Elimination des réductions Assignement unique Vectorisation
Atomiseur Transforme le code pour utiliser des opérations simples, « atomiques »
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+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]
Élimination des réductions 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 tS[0] = tS[0] + A[i] tS[1] = tS[1] + A[i+1] 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] t = B[i+1] * C[i+1] A[i+1] = t + D[i+1] t1 = B[i] * C[i] A[i] = t1 + D[i] 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 vecB = {B[i], B[i+1]} vecC = {C[i], C[i+1]} vecA = vecB + vecC {A[i], A[i+1]} = vecA
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…