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