Le but de ce tp est de vous montrer l’intérêt des instructions MMX du Pentium, et ainsi vous montrer ce qu’est une instruction SIMD.
1h30
Non, aprés ce Tp vous ne serez pas capable de reécrire le jeu DOOM en
3D sur un P4 :)
Mais vous comprendrez plus facilement l'utilité des instructions SIMD,
surtout quand on a besoin d'appliquer les mêmes calculs aux milliers
de points d'une image.
Saisir le programme suivant :
Compiler ce programme avec la commande :
$ gcc -gstabs mmx.s -o mmx
Le commutateur -g
indique à gcc qu'il doit inclure des
informations de débogage. stabs
indique le format des données à inclure.
Déboguer ensuite votre programme avec l'une des
commandes suivantes :
$ gdb ./mmx
$ ddd ./mmx
DDD utilise gdb, mais encapsulé dans une interface graphique plus agréable à utiliser. D'ailleurs, la console de gdb est visible dans le volet inférieur de la fenêtre...
Placer un point d'arrêt sur la ligne 28 : leave
.
Sous DDD, il suffit de double-cliquer dans la marge devant celle-ci... Si
vous avez laissé une marge !
Sous GDB, tapez la commande :
(gdb) break 28
Lancer ensuite votre programme : Cliquer sur le bouton
Run
sous DDD, ou lancer la commande
(gdb) run
L'exécution s'arrête automatiquement à la ligne choisie.
Il est aussi possible d'exécuter le programme pas-à-pas en
utilisant les commandes step
.
Il est maintenant temps de regarder le contenu de la mémoire. On va
pour cela utiliser la fonction display
suivie d'un format et d'une
adresse en mémoire :
(gdb) display /9xg
DDD vous permet de faire de méme, ou de façon graphique en
utilisant la commande graph display
.
Dans cette commande, le format spécifié indique trois choses :
L'affichage, sur deux colonnes, vous permet de comprendre pourquoi on a
utilisé la directive .octa
au lieu de .quad
...
Cet affichage sera répété après chaque
exécution d'une ligne de programme (step).
Pour annuler un affichage, vous pouvez utiliser la commande undisplay
suivie du numéro de l'affichage à supprimer.
Faire les calculs à la main et comparer les résultats avec ceux de la machine. Ceci met en évidence la taille des opérations MMX employées.
GDB vous permet donc d'ausculter votre programme sous toutes ses coutures. Il dispose de bien d'autres commandes, comme par exemple :
display) la valeur du symbole indiqué.
GDB peut accepter différents types d'expressions :
Une extension de GCC vous permet d'utiliser la programmation vectorielle directement en C. Bien que ce ne soit pas du C standard, le support de GCC pour cette dernière est assez solide. Essayez le programme suivant :
Bien entendu, si vous êtes sur une architecture 32 bits, vous devez activer le jeu d'instructions SSE pour en bénéficier :
gcc -march=pentium4 prog.c
Sur un processeur Core i7, ce programme (plus une boucle faisant 2 000 000 000 fois le calcul avant affichage) passe de 10 secondes à 4 secondes avec le SSE...
Je vous recommande d'expérimenter avec le SIMD. Par exemple, vous pouvez :