Streaming SIMD Extensions

Streaming SIMD Extensions

Streaming SIMD Extensions, généralement abrégé SSE, est un jeu de 70 instructions supplémentaires pour microprocesseurs x86, apparu en 1999 sur le Pentium III en réponse au 3DNow! d'AMD apparu 1 an plus tôt. Le fonctionnement est de type SIMD.

Il a été d'abord dévoilé sous le nom KNI signifiant « Katmai New Instructions » (Nouvelles instructions Katmai en anglais, Katmai étant le nom de code pour la première version du cœur du Pentium III). Pendant le projet Katmai, Intel désirait le distinguer de leurs lignes de produit précédentes et particulièrement de leur produit phare, le Pentium II. AMD ajouta le support d'instructions SSE, avec ses processeurs Athlon XP. Il fut ultérieurement renommé ISSE, ce qui signifie « Intel Streaming SIMD Extensions » (Extensions pour flux SIMD d'Intel en anglais), puis SSE.

Intel a globalement déçu par leur premiers travaux sur les SIMD et MMX IA-32. Le MMX avait deux problèmes principaux : Il réutilisait des registres à virgule flottante existants, rendant le CPU incapable de fonctionner simultanément en virgule flottante et en donnée SIMD et ne fonctionnait que sur les entiers.

Sommaire

Registres

XMM registers.png

Le SSE a originellement ajouté huit nouveaux registres 128 bits nommés XMM0 à XMM7. Les extensions x64 d'Intel et AMD ajoutent huit nouveaux registres de XMM8 à XMM15. Il y a également un nouveau registre 32 bits de contrôle/statut nommé MXCSR.

Chaque registre compacte ensemble quatre nombre flottants simple précision 32 bits. Les opérations SIMD entières peuvent toujours être effectuées par les huit registres 64 bits MMX.

Instructions SSE

Le SSE a à la fois introduit des instructions scalaires et de virgule flottante compactée.

Instructions à virgule flottante

  • Déplacement de donnée de mémoire à registre / Registre à mémoire / Registre à registre.
    • Scalaire - MOVSS
    • Compacté - MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
  • Arithmétique
    • Scalaire - ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
    • Compacté - ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
  • Comparaison
    • Scalaire - CMPSS, COMISS, UCOMISS
    • Compacté - CMPPS
  • Mélange de données et depactage.
    • Compacté - SHUFPS, UNPCKHPS, UNPCKLPS
  • Conversion de type de donnée
    • Scalaire - CVTSI2SS, CVTSS2SI, CVTTSS2SI
    • Compacté - CVTPI2PS, CVTPS2PI, CVTTPS2PI
  • Opération logiques bit à bit
    • Compacté - ANDPS, ORPS, XORPS, ANDNPS

Instructions entières

  • Arithmétiques
    • PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
  • Mouvement de données
    • PEXTRW, PINSRW
  • Autres
    • PMOVMSKB, PSHUFW

Autres instructions

  • Gestion MXCSR
    • LDMXCSR, STMXCSR
  • Gestion de la mémoire et du cache
    • MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

Exemple

Le simple exemple suivant démontre les avantages de l'utilisation du SSE.

Les instructions SSE1 fonctionnent avec des nombres flottants simple précision, c'est-à-dire stockés sur 4 octets. Une variable de vecteur 4 dimensions adapté aux registres est donc constituée de 16 octets. Si les données sont alignées sur 128 bits, on peut les lire avec l'instruction movaps, sinon si on ne peut pas le garantir, on doit utiliser movups. Sinon, on obtient une erreur à l'exécution.

En considérant une opération comme l'addition vectorielle, qui est très souvent utilisé dans les applications graphiques informatique. Le x87 requiert quatre instructions d'addition flottantes pour additionner entre eux deux vecteurs de dimension 2 à simple précision.

vec_res.x = v1.x + v2.x;
vec_res.y = v1.y + v2.y;
vec_res.z = v1.z + v2.z;
vec_res.w = v1.w + v2.w;

Cela correspond à quatre instructions FADD du x87 en code objet. Alors que le pseudo-code suivant montre qu'une seule instruction 128 bit (addition compacte) peut remplacer les quatre instructions d'addition scalaire. On suppose ici que les données sont alignées en mémoire sur 128 bits.

movaps xmm0,adresse-de-v1          ;xmm0 =      v1.w |      v1.z |      v1.y |      v1.x 
addps xmm0,adresse-de-v2           ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x               
movaps adresse-du-vec_res,xmm0

Cependant, c'est en faisant des opérations complexes et en utilisant au maximum les registres pour stocker les valeurs qu'on obtient vraiment un gain en vitesse.

Normaliser un vecteur

Supposons que le registre xmm0 contienne un vecteur à 3 dimension à normaliser (la 4ème composante étant à zéro). En utilisant temporairement les registres xmm6 et xmm7, on peut normaliser le vecteur ainsi :

       //Entrée: xmm0 contient un vecteur à normaliser
       movaps xmm6, xmm0      //effectue une copie du vecteur dans xmm6
       mulps xmm0, xmm0       //carré de chaque composante
       //mix1
       movaps xmm7, xmm0
       shufps xmm7, xmm7, $4e
       addps xmm0, xmm7       //additionne les composantes mélangées
       //mix2
       movaps xmm7, xmm0
       shufps xmm7, xmm7, $11
       addps xmm0, xmm7       //additionne les composantes mélangées
       //1/sqrt
       rsqrtps xmm0, xmm0     //inverse de la racine carrée (= longueur)
       mulps xmm0, xmm6       //que multiplie le vecteur initial
       //Sortie: xmm0 contient le vecteur normalisé

Produit vectoriel

Supposons que les variables vS1 et vS2 contiennent deux vecteurs définissant un plan, ayant 3 composantes et 1 composante non utilisée. Le produit vectoriel permet d'obtenir un vecteur normal, c'est-à-dire perpendiculaire à ce plan. En utilisant temporairement les registres xmm6 et xmm7, on peut calculer le produit vectoriel et le stocker dans xmm0 comme cela :

       movups xmm6, vS1             //le U signifie qu'on ne suppose pas que les données sont alignées à 128 bits
       shufps xmm6, xmm6, 9         //= 1 + 8, c'est-à-dire une rotation des 3 composantes
       movups xmm7, vS2
       shufps xmm7, xmm7, 18        //= 2 + 16, c'est-à-dire une rotation dans l'autre sens
       movaps xmm0,xmm6             //premier produit pour chaque composante
       mulps xmm0,xmm7
       movups xmm6, vS1
       shufps xmm6, xmm6, 18
       movups xmm7, vS2
       shufps xmm7, xmm7, 9
       mulps xmm7,xmm6              //deuxième produit retranché pour chaque composante
       subps xmm0,xmm7
       //Sortie: xmm0 contient le produit vectoriel de vS1 et vS2

Évolutions

  • Le SSE2 créé pour le pentium 4 ajoute des instructions flottantes double précision (64 bits) et étend les instructions MMX avec des opérations sur les registres XMM 128 bits.
  • Le SSE3 sur le Pentium IV Prescott, ajoute des instructions mathématiques orientées DSP et quelques instructions de gestion de processus.
  • Le SSSE3 ajoute 16 nouveaux opcodes qui incluent la permutation des octets dans un mot, la multiplication des nombres à virgule fixe 16 bits avec un arrondissement correct et des instructions d'accumulation dans un mot. SSSE3 est souvent confondu avec SSE4 car ce terme a été utilisé pendant la phase de développement de la microarchitecture.
  • Le SSE4 est une autre avancée majeure, ajoutant une instruction de produit scalaire, de nombreuses instructions d'additions entières, une instruction popcnt et d'autres instructions. SSE4 arrête le support des registres MMX. Le SSE4 est supporté par la version 'Penryn' de la microarchitecture Core 2[1],[2].
  • Le SSE5 prévu initialement pour mi-août 2007 par AMD, permet, comme dans les processeurs RISC, de préciser dans l'instruction un troisième registre destination, ce qui permet d'économiser un bon nombres d'instructions et devrait intrinsèquement accélérer les calculs. Auparavant, il fallait d'abord copier le contenu du registre destination dans un nouveau registre afin de ne pas détruire les informations précédentes[3],[4].

Notes et références

  1. (en)[1]
  2. (en)[2]
  3. (en)AMD plots single thread boost with x86 extensions sur theregister.co.uk
  4. (en)128-Bit SSE5 Instruction Set sur developer.AMD.com

Articles connexes


Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Streaming SIMD Extensions de Wikipédia en français (auteurs)

Игры ⚽ Нужна курсовая?

Regardez d'autres dictionnaires:

  • Streaming SIMD Extensions — (SSE) is a SIMD (Single Instruction, Multiple Data) instruction set extension to the x86 architecture, designed by Intel and introduced in 1999 in their Pentium III series processors as a reply to AMD s 3DNow! (which had debuted a year earlier).… …   Wikipedia

  • Streaming SIMD Extensions — Die Streaming SIMD Extensions (SSE), früher auch Internet Streaming Extensions (ISSE) ist eine von Intel entwickelte Befehlssatzerweiterung der X86er Architektur, welche mit der Einführung des Pentium III (Katmai) Prozessors vorgestellt wurde und …   Deutsch Wikipedia

  • Streaming SIMD Extensions 5 — SSE5 (Streaming SIMD Extensions 5) war eine geplante Befehlssatzerweiterung von AMD für x86 Prozessoren. Sie umfasste 47 Befehle, die vor allem zur Beschleunigung bestimmter Algorithmen, beispielsweise FFT, DCT oder der Verschlüsselung mit AES,… …   Deutsch Wikipedia

  • Streaming SIMD Extensions — SSE (англ. Streaming SIMD Extensions, потоковое SIMD расширение процессора) это англ. Single Instruction, Multiple Data, Одна инструкция множество данных) набор инструкций, разработанный Pentium III как ответ на аналогичный набор инструкций… …   Википедия

  • Streaming SIMD Extensions 2 — SSE2 (Streaming SIMD Extensions 2) ist eine x86 Befehlssatzerweiterung, die Intel mit dem Intel Pentium 4 einführte. Die mit SSE eingeführten 128 Bit Register können in SSE2 auch mit MMX Operationen verwendet werden. SSE2 ermöglicht die… …   Deutsch Wikipedia

  • Streaming SIMD Extensions 3 — Die Streaming SIMD Extensions 3 (kurz SSE3) ist die zweite Erweiterung des SSE Befehlssatzes. Sie ist auch unter dem Intel Codenamen Prescott New Instructions (PNI) bekannt, da sie zuerst bei der Prescott Variante des Pentium 4 ab Frühjahr 2004… …   Deutsch Wikipedia

  • Streaming SIMD Extensions 2 — SSE2 (англ. Streaming SIMD Extensions 2, потоковое SIMD расширение процессора)  это Pentium 4. SSE2 использует восемь 128 битных регистров (xmm0 до xmm7), включённых в архитектуру x86 с вводом расширения SSE, каждый из которых трактуется как 2… …   Википедия

  • Streaming SIMD Extensions 4 — SSE4 (Streaming SIMD Extensions 4) ist eine Befehlssatzerweiterung, die bei AMD seit K10 und bei Intel seit der Penryn Variante der Core 2 Prozessoren verwendet wird. Der zweite Teil, SSE4.2 genannt, wurde mit der Intel Nehalem Mikroarchitektur… …   Deutsch Wikipedia

  • Internet Streaming SIMD Extensions — Streaming SIMD Extensions Streaming SIMD Extensions, généralement abrégé SSE, est un jeu de 70 instructions supplémentaires pour microprocesseurs x86, apparu en 1999 sur le Pentium III en réponse au 3DNow! d AMD apparu 1 an plus tôt. Le… …   Wikipédia en Français

  • Streaming SIMD Extensions —    Abbreviated SSE. A set of multimedia instructions introduced with Intel s Pentium III. SSE provides four main improvements over the Pentium II instruction set:    • Eight new directly addressable 128 bit floating point registers.    • Eight… …   Dictionary of networking

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”