5MMCEAMC/SLE-3A Travaux Pratiques
Utilisation des extensions SIMD du pentium pour le calcul
de la conversion YCbCr vers RGB
Frédéric Pétrot
Durée : 3 heures
1 Organisation
Le travail se fait en binôme cette fois-ci (l’expérience forme la jeunesse). Le sujet est découpé en
parties qui peuvent au départ être faites plus ou moins indépendamment, aussi il est raisonnable que
les 2 membres du binôme travaillent en parallèle (de degré 2 ici).
Merci de m’envoyer votre fichier au plus tard lundi soir minuit, c’est là dessus que vous
serez notés (ou pas, ...).
2 Introduction
Ce TP a pour objectif de mettre en pratique l’utilisation des opérations SIMD de base (dites MMX) du
processeur x86. SIMD signifie Single Instruction, Multiple Data, ce qui veut dire que la même opération
va être exécutée sur
n
données différentes (et indépendantes) simultanément. Un exemple simple est
l’exécution d’une addition sur les 4 octets d’un mots de 32 bits considérés indépendamment.
Les instructions MMX d’Intel travaillent sur des registres de 64 bits dont le contenu peut être
considéré comme soit 8 octets (de 8 bits, dits bytes), 4 entiers courts de 16 bits (appelés words par
Intel), 2 entiers de 32 bits (appelés doubles), ou 1 entier long de 64 bits (encore dit quad). Il y a 57
instructions MMX, mais le travail demandé ne requière l’utilisation que d’un petit sous-ensemble. Pour
information, je n’ai utilisé que les 15 suivantes dans ma correction :
Une rapide explication des instructions MMX se trouve sur le site
. Attention, sur ce cite l’ordre des
opérandes dans les instructions est celui de l’assembleur Intel, alors que par défaut GAS utilise l’ordre
opposé : l’opérande 1 et le résultat sont à droite.
Le TP utilise un décodeur vidéo Motion-JPEG (celui du projet C de 1ère année pour être précis),
dans lequel nous allons tenter d’optimiser une fonction particulière, celle qui assure la conversion des
composantes de luminance et chrominance en rouge, vert, bleue pour l’affichage dans un frame buffer.
3 Travail demandé
3.1 Préliminaires
Récupérez sur le site du cours ( ) l’ar-
chive contenant les sources nécessaires au TP. Cette archive s’expand dans le répertoire , et
contient une vidéo qui sera notre benchmark, un , des fichiers
objets contenant les différentes phases du décodage hormis la conversion YUV vers RGB, et trois fichiers
sources contenant diverses implantations (dont certaines partielles) de la conversion.
1
la version initiale en virgule flottante ;
la version en entiers ;
la version avec le support vectoriel du compilateur gcc ;
la version qui est le sujet de la première partie de la question 1 ;
la version qui est le sujet de la deuxième partie de la question 1 ;
la version qui est le sujet des questions 2 et suivantes.
L’exécutable crée prend 1, 2 ou 3 arguments. Le premier est le nom de la vidéo, le second le nombre
de frame à décoder, et le troisième n’importe quoi. En présence de ce troisième argument, le résultat du
décodage n’est pas affiché (à 25 images par secondes), ainsi c’est la vitesse brute qui peut être mesurée.
Afin de voir combien de temps prend le décodage (sur le film complet), on peut lancer :
Question 1
Le MMX permettant d’exploiter le parallélisme des données, proposez une nouvelle version de cette
fonction, toujours écrite en C, qui mette en évidence un parallélisme de degré 4 sur la boucle interne. Il
n’est pas possible d’exprimer le parallélisme dans le C standard, aussi on utilisera des tableaux de taille
4. Dans un premier temps, on utilisera des boucles qui vont itérer de 0 à 3 sur ces tableaux. Relancez
l’exécution pour vérifier que vos modifications n’ont pas d’impact sur le fonctionnement.
Dans un second temps, on déroulera explicitement les boucles de 0 à 3, ce qui nécessite de la
recopie de code. Il est clair que ce n’est pas une pratique de programmation recommandée, mais on
fera une exception cette fois, c’est pour la bonne cause. Relancez l’exécution pour vérifier que le résultat
est toujours
Quelques informations supplémentaires
Comme nous travaillons avec un parallélisme de degré 4 et que les registres sont de 64 bits, la taille
des données manipulées sera de 64
4= 16 bits.
Le code assembleur s’écrit inline grâce aux directives . Les registres MMX se notent à
.
La syntaxe des cas d’utilisations qui vous seront nécessaires est :
pour les opérations impliquant deux registres MMX déter-
minés ;
pour mettre dans le registre le contenu de
la variable (considérée dans un registre, mettre à la place de si on veut une variable
en mémoire) ;
pour mettre dans la variable (qui est dans
un registre) la valeur contenue dans . Si l’on veut écrire en mémoire, il faut alors mettre
à la place de ;
une valeur absolue peut être utilisée dans certains cas, il faut alors utiliser la notation pour la
constante 1. Si une constante doit être utilisée mais que l’instruction ne peut en prendre, alors il
faut passer par un .
2
Quelques exemples utiles :
mise à zéro du registre mmx : ;
chargement d’une constante 64 bits dans un registre :
décalage par une constante (ici 8) : .
Les registres MMX étant ceux du coprocesseur flottant, on peut inspecter leur valeur grâce à
dans .
Question 2
Chargez les 4 premiers octets du premier macro-bloc Y sous forme de mots de 16 bits dans le
registre . Astuce : utiliser l’instruction .
Vous pourrez utiliser les instructions suivantes pour vérifier que tout se passe bien :
Question 3
Chargez les 4 premiers octets des macro-blocs Cr et Cb sous forme de mots de 16 bits et leur
soustraire 128. Placer les résultats dans les registres et .
Question 4
Effectuez le calcul de 4 composantes R dans les 4 octets de poids faible de simultanément à
partir de , et des constantes appropriées.
Faites de même pour B dans puis G dans .
Astuce : utiliser l’instruction pour se ramener à des octets.
Question 5
Construisez 4 mots de 32 bits ayant chacun comme structure à partir de , et .
Astuce : l’opération s’apparente à une transposition de matrice 4x4, et peut se faire avec les instructions
, et .
3
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !