+ A[i] tS[1]

publicité
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…
Téléchargement