SSE : Des registres sous forme de vecteurs¶
Précédemment nous avons parlé de \({\mathbb R}^3\) où un point, que l’on appelle aussi un vecteur, est représenté par 3 coordonnées \((x_0,x_1,x_2)\). De façon plus général, un vecteur de taille \(n\) est représenté par \(n\) composantes \((x_0,x_1,\dots,x_{n-1})\), les composantes appartenant toutes à un même ensemble (\(\mathbb R\) par exemple). Une opération entre deux vecteurs revient à appliquer \(n\) opérations sur les composantes des vecteurs.
En 1999, le jeu d’instructions SSE (Streaming SIMD Extensions) introduit 8 nouveaux registres de 128 bits et 70 instructions pour les manipuler. La norme x86-64 introduit 8 nouveaux registres portant à 16 le nombre de registres 128 bits utilisables. Les instructions peuvent agir sur les registres de 128 bits en les considérant comme :
- des vecteurs constitués de 2 composantes \((x_1,x_0)\) de 64 bits chacune,
127 63 0
|--------------------|--------------------|
|________x_1_________|_________x_0________|
64
- des vecteurs constitués de 4 composantes \((x_3,x_2,x_1,x_0)\) de 32 bits chacune,
127 95 63 31 0
|----------|----------|----------|----------|
|___x_3____|____x_2___|____x_1___|____x_0___|
96 64 32
- des vecteurs constitués de 8 composantes \((x_7,x_6,x_5,x_4,x_3,x_2,x_1,x_0)\) de 16 bits chacune,
127 111 95 79 63 47 31 15 0
|----------|----------|----------|----------|----------|----------|----------|----------|
|___x_7____|____x_6___|____x_5___|____x_4___|___x_3____|____x_2___|____x_1___|____x_0___|
112 96 80 64 48 32 16
- des vecteurs constitués de 16 composantes \((x_{15},x_{14},x_{13},x_{12},x_{11},x_{10},x_9,x_8,x_7,x_6,x_5,x_4,x_3,x_2,x_1,x_0)\) de 8 bits chacune
127 119 111 103 95 87 79 71 63 55 47 39 31 23 15 7 0
|------|------|------|------|------|------|------|------|------|------|------|------|-- ---|------|------|------|
|_x_15_|_x_14_|_x_13_|_x_12_|_x_11_|_x_10_|__x_9_|__x_8_|__x_7_|__x_6_|__x_5_|__x_4_|__x_3_|__x_2_|__x_1_|__x_0_|
120 112 104 96 88 80 72 64 56 48 40 32 24 16 8