Depuis la seconde moitié des années 1990, les principaux jeux d’instructions (Intel IA32 et Intel 64, ARM, IBM, etc.) ont introduit des extensions SIMD. Les caractéristiques essentielles ont été présentées dans l’article [H 1 200]. Si Intel a continué à augmenter la taille des registres SIMD de 64 bits à 128, 256 et 512 bits, les autres extensions ont toujours des registres SIMD de 128 bits. Au lieu d’étendre l’extension Neon à 256 bits, ARM a choisi de définir une nouvelle extension appelée SVE (Scalable Vector Extension) qui est de fait une extension vectorielle.
Nous présentons la différence entre les extensions SIMD et les extensions vectorielles. Dans une extension SIMD, pour une opération donnée, il y a une instruction différente pour chaque taille de registre SIMD, pour chaque taille (8, 16, 32, 64 bits) et chaque type de données (entiers signés ou non signés, flottants). Dans une extension vectorielle, il y a une seule instruction par opération : des registres de longueur vectorielle et de configuration définissent la longueur des registres vectoriels, la nature des éléments et le nombre d’éléments sur lesquels porte l’opération définie par l’instruction. Sur le benchmark DAXPY, le nombre d’instructions du benchmark (code statique) et le nombre d’instructions exécutées sont comparés.
L’évolution des extensions SIMD est examinée. En plus de l’augmentation de la taille des registres (256 bits pour AVX en 2008, 512 bits pour AVX-512 en 2013), les extensions Intel ont vu l’introduction de caractéristiques vectorielles que l’on trouvait dans les machines vectorielles comme le Cray-1 (1976). AVX-2 introduit les instructions gather et scatter, qui permettent des accès mémoire avec des pas non unitaires alors que le SIMD pur ne permet que d’accéder à des mots mémoire successifs. AVX-512 introduit les instructions avec masque, c’est-à-dire que l’instruction opère en fonction d’un registre de masque, permettant de sélectionner les éléments sur lesquels porte l’opération. L’évolution des extensions SIMD Intel se traduit par une très grande augmentation du nombre d’instructions. La taille variable des instructions Intel le permet, au prix d’une augmentation du nombre d’octets des instructions (2 à 3 pour AVX, 4 pour AVX-512). Par contre, c’est un problème pour les jeux d’instructions de taille fixe, comme ARM, pour lesquels le nombre de codes opération est limité.
Les deux principales extensions vectorielles sont présentées : l’extension SVE d’ARM et l’extension vectorielle du jeu d’instructions open source RISC-V. L’organisation des registres vectoriels et des registres de configuration, ainsi que les grandes classes d’instructions sont détaillées.
L’approche vectorielle utilise beaucoup moins d’instructions. Un autre avantage est qu’elle est définie « from stratch », sans tenir compte du passé (compatibilité binaire ascendante). C’est la possibilité d’opérer sur des registres vectoriels plus longs qui lui donne un avantage significatif. Pour le programmeur, il n’y a pas de différence notable car la tâche du compilateur est très semblable, qu’elle vise des instructions SIMD ou des instructions vectorielles. En effet, la difficulté réside dans la transformation d’un code scalaire en code SIMD ou vectoriel (« vectorisation »), plus que dans le choix des instructions SIMD ou vectorielles adéquates.