Un petit billet sur un sujet informatique pour changer des sujets plus statistiques. J’ai fait un récapitulatif de la gestion des jeux d’instructions complémentaires (SSE2, SSSE3, SSE4.2, AVX, AVX2, AVX-512) par les processeurs AMD et Intel. Cette liste devrait permettre aux programmeurs de savoir ce qu’on peut raisonnablement considérer comme universellement présent et ce qui est seulement disponible sur certains processeurs uniquement. Par exemple, il est possible que le jeu vidéo Star Citizen requière AVX par méconnaissance du défaut de support par les processeurs Pentium Gold récents; ce n’est pas le haut de gamme, mais couplé à un GPU correct, cela aurait dû faire tourner tous les jeux vidéos.
Tableaux bruts
Jeu d’instructions | Famille | Date d’introduction | Dernier proc à ne pas gérer | Début du support complet sur toute la gamme |
SSE2 | Atom | 2008 (first Atom) | Aucun | 2008 |
SSE2 | High-end Intel | 2000 | 2000 | 1999 |
SSE2 | AMD | 2003 | 2004 (Barton) | 2004 (Paris) |
SSSE3 | Atom | 2008 (first Atom) | Aucun | 2008 |
SSSE3 | High-end Intel | 2006 (Core) | 2007 (Yonah) | 2006/2007 |
SSSE3 | AMD | 2011 (Bulldozer, Bobcat) | 2012 (Sempron X2 198, A4-3450) | 2012 |
x86_64 | Atom | 2008 | 2012 | 2013 |
x86_64 | High-end Intel | 2005 (Prescott) | 2007 (Yonah) | 2006/2007 |
x86_64 | AMD | 2003 | 2004 (Barton) | 2004 |
SSE4.2 | Atom | 2013 | 2013 (Saltwell / Avoton) | 2013/2014 |
SSE4.2 | High-end Intel | 2008 (Nephalem) | 2008 (Core) | 2008 |
SSE4.2 | AMD | 2011 (Bulldozer) | 2011/2012 (A4-3450) | 2011/2012 |
AVX | Atom | Probablement 2022 | Futur | Futur |
AVX | High-end Intel | 2011 (Sandy Bridge) | 2021 (Comet Lake-S) | 2020/2021 (Tiger Lake) |
AVX | AMD | 2011 (Bulldozer) | 2011/2012 (A4-3450) | 2011/2012 |
AVX2 | Atom | Probablement 2022 | Futur | Futur |
AVX2 | High-end Intel | 2013 | 2021 (Comet Lake-S) | 2020/2021 (Tiger Lake) |
AVX2 | AMD | 2015 (Carrizo / A10-8700P) | 2016 (Godavari/A10-7890K) | 2016 |
AVX-512 | Atom | Aucun | Aucun | Aucun |
AVX-512 | High-end Intel | 2016 (Knights Landing) | Futur ou jamais | Futur ou jamais |
AVX-512 | AMD | Aucun | Inconnu | Inconnu |
Le tableau ci-dessous est une version simplifiée du précédent, regroupant les trois familles de processeurs : Atom, High-end Intel et AMD.
Jeu d’instructions | Date d’introduction | Dernier proc à ne pas gérer | Début du support complet sur toute la gamme | Délai entre introduction et adoption généralisée |
SSE2 | 2000 | 2004 (Barton) | 2004 (Paris) | 4 ans |
SSSE3 | 2006 (Core) | 2012 (Sempron X2 198, A4-3450) | 2012 | 6 ans |
x86_64 | 2003 | 2012 | 2013 | 10 ans |
SSE4.2 | 2008 (Nephalem) | 2013 (Saltwell / Avoton) | 2013/2014 | 5-6 ans |
AVX | 2011 (Sandy Bridge) | Futur | Futur | > 11 ans |
AVX2 | 2013 | Futur | Futur | > 9 ans |
AVX-512 | 2016 (Knights Landing) | Futur ou jamais | Futur ou jamais | > 6 ans |
Rythme d’adoption
On peut observer une adoption très lente de certains jeux, pour diverses raisons. Le jeu d’instructions x86_64 a été introduit en 2003 par AMD sur la gamme Athlon 64 et a été rapidement généralisée par AMD; lorsqu’Intel a réalisé l’échec de l’Itanium, il a adopté cette architecture 64 bits en 2005 avec le Pentium 4 Prescott, ce qui peut paraître assez rapide. Malheureusement, Intel a énormément tardé à passer à l’architecture 64 bits sur la plateforme Atom. L’adoption des autres jeux d’instructions SSE2, SSSE3 et SSE4.2 a été plus rapide, avec un certain retard pour les processeurs Atom ou pour AMD; possiblement à cause d’une certaine concurrence entre le SSE4a d’AMD et les SSSE3/SSE4.1/SSE4.2 d’Intel.
Le cas d’AVX et AVX2 mérite qu’on s’y attarde. AMD a très vite adopté AVX, presque simultanément avec Intel, se basant sur les plans annoncés d’Intel. C’est en se basant sur une ébauche trop précoce qu’AMD s’est retrouvé à implémenter FMA4 alors qu’Intel adopta finalement FMA3. Pourtant, plus de dix ans plus tard, une partie importante des processeurs commercialisés par Intel en 2020 ou 2021 ne gère toujours pas ce jeu d’instructions : Celeron et Pentium Gold de l’architecture Comet Lake ainsi que tous les produits dérivés de la microarchitecture Atom Tremont. Cette situation semble explicable par une fragmentation du marché voulue par Intel, avec une désactivation des unités AVX du Comet Lake sur le bas de gamme (Celeron et Pentium Gold) tandis que les processeurs montant en gamme, basés sur la même microarchitecture (core i3/i5/i7/i9) en bénéficient pleinement.
Point de vue du programmeur
Un développeur d’application peut ignorer les utilisateurs disposant d’une machine très ancienne, car ils représentent une faible fraction de l’ensemble des utilisateurs et pourraient éventuellement avoir des problèmes de performances d’exécution trop sévères pour que l’application soit utilisable. Les hypothèses que l’on peut raisonnablement faire dépendent de la catégorie d’application et de son exigence de performances. Un jeu vidéo dernier cri exigera une machine récente, ce qui est attendu des joueurs. Une application bureautique telle qu’un traitement de texte devra tourner sur de vieilles machines. En 2021, au CHU de Rouen, on trouve encore beaucoup de Pentium G640 datant de 2012, voire plus ancien. Ce retard technologique peut être expliqué par plusieurs facteurs. Premièrement, les constructeurs de PC ont toujours du retard par rapport aux processeurs vendus; pour Lenovo, on peut compter environ un an de retard. Deuxièmement, une grande entreprise préfèrera avoir un parc homogène de machines, quitte à avoir des machines un peu plus anciennes. Troisièmement, le renouvellement du parc est une opération coûteuse qui sera faite d’autant plus rarement que les machines ont une faible obsolescence pour un usage bureautique. Ces machines, veilles de 9 ou 10 ans restent encore suffisamment performantes pour un usage bureautique confortable. En raison de la crise COVID-19 et de l’essor des cryptomonnaies, la demande d’électronique a beaucoup augmenté, les ruptures de stock sont nombreuses et actuellement des machines obsolètes sont vendues hors de prix. C’est ainsi qu’on peut trouver, des machines neuves basées sur des processeurs qui ont 5 ans de retard.
Aujourd’hui on peut raisonnablement considérer que le SSE2 est disponible partout, même pour une application bureautique. On comprend aussi qu’exiger AVX est déraisonnable, même pour un jeu vidéo; ces derniers étant généralement plus exigants sur le GPU que le CPU. C’est ainsi qu’un des jeux les plus gourmands en ressources de l’année 2020, tourne finalement avec un CPU de milieu de gamme de 2012 mais était à deux doigts de ne pas tourner sur l’entrée de gamme de 2020 à cause d’AVX, pour un gain de performances tellement négligeable que les développeurs ont préféré complètement supprimer le support plutôt que de l’utiliser conditionnellement à sa présence. Il faut dire que de gérer optionnellement un jeu d’instructions est très difficile à faire correctement à cause des fonctions inlines, sauf sur le compilateur C d’Intel (ICC) qui pénalise abusivement les processeurs AMD en exécutant le pire code dessus. Pour compliquer les choses, l’AVX ne fait pas bon ménage avec le SSE/SSE2, parce que les instructions SSE opérant sur les registres xmm préservent la partie haute des registres ymm; cette fonctionnalité étrange étant voulue par Intel pour des raisons de rétro-compatibilité avec des pilotes binaires susceptibles d’exécuter des instructions SSE durant une interruption matérielle. Cela engendre une pénalité énorme si VZEROUPPER n’est pas appelé entre les instructions AVX et SSE; sauf pour les Xeon Phi de la microarchitecture Knights Landing pour lesquels c’est exactement l’inverse, avec une pénalité de 36 cycles à exécuter VZEROUPPER. On peut raisonnablement ignorer les Xeon Phi qui concernent une toute petite partie du marché, mais l’obligation d’employer VZEROUPPER est déjà délicate dans tout programme utilisant des fonctions de bibliothèques basées sur SSE/SSE2 au milieu de code AVX. Ce problème serait transitoire si le support d’AVX avait été rapidement universel, mais Intel n’a pas voulu que ce soit ainsi. Heureusement, mes analyses semblent montrer que même pour des opérations très parallélisables, AVX+AVX2+FMA3 n’apportent quasiment aucune accélération par rapport à SSE2 : environ 5% pour la multiplication de matrices sur Ryzen 1700. En bref, AVX et AVX2 sont des jeux d’instructions utiles pour le marketing mais trop compliquées à utiliser, trop peu disponibles et ne servant finalement pas à grand chose. C’est encore pire avec AVX-512 qui finalement consomme tellement d’espace et d’énergie qu’il ne sera pas disponible sur la prochaine génération de processeurs Alder Lake d’Intel parce que ces derniers utilisent une stratégie big.LITTLE.