Optimisation et parallélisation de code pour processeur à instructions SIMD multimedia François Ferrand.

Slides:



Advertisements
Présentations similaires
Bratec Martin ..
Advertisements

NOTIFICATION ÉLECTRONIQUE
Fragilité : une notion fragile ?
SEMINAIRE DU 10 AVRIL 2010 programmation du futur Hôtel de Ville
Phono-sémantique différentielle des monosyllabes italiens
MAGGIO 1967 BOLOGNA - CERVIA ANOMALIES DU SOMMEIL CHEZ L'HOMME
droit + pub = ? vincent gautrais professeur agrégé – avocat
Transcription de la présentation:

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…