Adoption jeux d’instructions

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’instructionsFamilleDate d’introductionDernier proc à ne pas gérerDébut du support complet sur toute la gamme
SSE2Atom2008 (first Atom)Aucun2008
SSE2High-end Intel200020001999
SSE2AMD20032004 (Barton)2004 (Paris)
SSSE3Atom2008 (first Atom)Aucun2008
SSSE3High-end Intel2006 (Core)2007 (Yonah)2006/2007
SSSE3AMD2011 (Bulldozer, Bobcat)2012 (Sempron X2 198, A4-3450)2012
x86_64Atom200820122013
x86_64High-end Intel2005 (Prescott)2007 (Yonah)2006/2007
x86_64AMD20032004 (Barton)2004
SSE4.2Atom20132013 (Saltwell / Avoton)2013/2014
SSE4.2High-end Intel2008 (Nephalem)2008 (Core)2008
SSE4.2AMD2011 (Bulldozer)2011/2012 (A4-3450)2011/2012
AVXAtomProbablement 2022FuturFutur
AVXHigh-end Intel2011 (Sandy Bridge)2021 (Comet Lake-S)2020/2021 (Tiger Lake)
AVXAMD2011 (Bulldozer)2011/2012 (A4-3450)2011/2012
AVX2AtomProbablement 2022FuturFutur
AVX2High-end Intel20132021 (Comet Lake-S)2020/2021 (Tiger Lake)
AVX2AMD2015 (Carrizo / A10-8700P)2016 (Godavari/A10-7890K)2016
AVX-512AtomAucunAucunAucun
AVX-512High-end Intel2016 (Knights Landing)Futur ou jamaisFutur ou jamais
AVX-512AMDAucunInconnuInconnu
Tableau 1 : support des jeux d’instructions par les processeurs Intel et AMD; High-end Intel correspond à toutes les plateformes d’Intel non basées sur Atom, c’est-à-dire, Xeon, core i3/i5/i7, Pentium Gold, Celeron.

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’instructionsDate d’introductionDernier proc à ne pas gérerDébut du support complet sur toute la gammeDélai entre introduction et adoption généralisée
SSE220002004 (Barton)2004 (Paris)4 ans
SSSE32006 (Core)2012 (Sempron X2 198, A4-3450)20126 ans
x86_6420032012201310 ans
SSE4.22008 (Nephalem)2013 (Saltwell / Avoton)2013/20145-6 ans
AVX2011 (Sandy Bridge)FuturFutur> 11 ans
AVX22013FuturFutur> 9 ans
AVX-5122016 (Knights Landing)Futur ou jamaisFutur ou jamais> 6 ans
Tableau 2 : introduction et adoption généralisée des jeux d’instructions sur l’ensemble de la gamme de processeurs Intel et AMD

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *