Pentium 4 : Voyage au cœur du CPU
By Franck
Sommaire:

 

Le Nouveau Jeux d'instructions SSE2

 


La gamme des processeurs Intel s'est contenté des seuls jeux d'instructions x86 et x87 jusqu'au Pentium, et depuis pas moins de trois nouveaux jeux d'instructions sont apparus : MMX, 3DNow! (et son extension Extended 3DNow!), et enfin le SSE.
Le Pentium 4 intègre bien entendu le MMX et le SSE, et étend ce dernier avec 144 nouvelles instructions, le SSE2, littéralement Streaming SIMD (Single Instruction Multiple Data) Extension 2.

Profitons de ce paragraphe pour commenter un peu ce phénomène des jeux d'instructions. Leur apparition coïncide avec celle de la recherche de la parallélisation sur les processeurs. Le Pentium a inauguré ce phénomène avec son architecture superscalaire, qui lui permettait dans certains cas de traiter deux instructions simultanément. La technologie SIMD repose sur une technique différente, à savoir traiter plusieurs données mais en une seule instruction. D'un point de vue complexité, il est beaucoup plus simple pour un processeur de traiter par exemple une instruction opérant sur quatre données, plutôt que de traiter simultanément quatre instructions opérant chacune sur une donnée. Dans le premier cas une unité de calcul suffit, alors que dans le second il faut au moins quatre unités de calcul, et un système complexe de répartition des instructions, le débit final étant le même dans les deux cas.

Mais si l'effort de parallélisation n'est pas fait pas le processeur, il doit être présent dans le code en et c'est bien là qu'est tout le problème des jeux d'instructions SIMD. Les compilateurs actuels sont en effet pratiquement incapable de générer du code "vectorisé", c'est-à-dire exploitant la parallélisation des instructions SIMD. Ce travail doit encore être fait à la main, c'est très long, et surtout très coûteux pour les éditeurs de logiciels.

Ceci étant, voyons ce que le jeu d'instruction SSE2 apporte de plus par rapport aux précédents jeux d'instructions, et pour cela traçons un rapide historique depuis le MMX.

- Le jeu d'instruction MMX se caractérise par :

  • Huit registres 64 bits (mappés sur les registres de la FPU)
  • Des instructions opérants sur des entiers 8, 16 et 32 bits regroupés dans ces registres.
- Le jeu d'instruction SSE a quant à lui apporté :
  • 8 registres 128 bits (non plus mappés mais indépendants).
  • Des instructions opérants sur quatre flottants de 32 bits regroupés dans un registre.
  • De nouvelles instructions MMX.
  • Le prefetch software (préchargement de données dans les différents niveaux de cache).
  • Des instructions de contrôle de lecture / écriture en mémoire.
- Le SSE2 utilise les 8 même registres 128 bits que le SSE, et étend le jeu d'instructions par :
  • Le traitement des flottants en double précision. Le SSE2 permet de traiter en plus deux flottants 64 bits par registre, en offrant les mêmes opérations arithmétiques (addition, multiplication), logiques (AND, OR), de comparaison et de conversion flottant vers entier.
  • Des nouvelles instructions de traitement sur les entiers 8, 16, 32 et 64 bits, permettant ainsi d'effectuer la plupart des opérations MMX dans les registres 128 bits du SSE. Ces instructions permettent ainsi de manipuler des données entières ou flottantes au sein des mêmes registres. C'est une amélioration importante, permettant d'éviter les opérations conjointes entre les registres 64 bits MMX et 128 bits SSE.
  • Des instructions supplémentaires de gestion du cache et de contrôle de lecture / écriture en mémoire. Notons en particulier l'instruction CLFLUSH qui permet de « vidanger » une ligne de cache.

Les instructions nommées «de contrôle de lecture / écriture en mémoire» permettent d'effectuer des opérations vers la mémoire sans passer par le cache. Quel est l'intérêt de ne pas passer par le cache ? De ne pas le polluer avec des données dont on sait qu'elles ne seront pas utilisées d'ici peu.

Les instructions de contrôle de la mémoire cache sont arrivées avec le SSE et ont été encore étendues avec le SSE2. Jusqu'alors, tout contrôle sur le fonctionnement de la mémoire cache était inaccessible aux programmeurs, les constructeurs préférant se fier à leurs propres algorithmes intégrés dans les puces. Mais les choses ont changé, et il est désormais possible de précharger des données dans les différents niveaux de cache, de passer outre ces mêmes niveaux lors de lecture ou d'écritures, et même de forcer une ligne de cache à se vider.

Pourquoi ce phénomène ? Non pas que les algorithmes de gestion des caches soient moins performants qu'avant (c'est plutôt le contraire), mais parce que l'influence des mémoires caches sur les performances globales a considérablement augmenté (le processeur tournant parfois 20 fois plus vite que le reste du système). Ainsi, toute mauvaise gestion du cache peut avoir des conséquences importantes sur les performances. Les algorithmes étant limités, les constructeurs offrent aux programmeurs la possibilité d'intervenir sur certains paramètres importants.

 

 

 

 

Suite ( L'Hyper-Threading )

Close