Article de reference

processeur vectoriel

En informatique , un processeur vectoriel est une unité centrale de traitement (CPU) dotée d'un jeu d'instructions conçu pour traiter efficacement et de manière séquentielle de ...

En informatique , un processeur vectoriel est une unité centrale de traitement (CPU) dotée d'un jeu d'instructions conçu pour traiter efficacement et de manière séquentielle de grands tableaux de données unidimensionnels appelés vecteurs . Lorsqu'il est intégré comme composant matériel, le processeur vectoriel est souvent appelé unité de traitement vectoriel (VPU). Ceci contraste avec les processeurs scalaires , dont les instructions opèrent sur des données individuelles, et avec certains de ces mêmes processeurs scalaires qui intègrent des unités arithmétiques SIMD ( Single Instruction, Multiple Data ) ou SWAR ( SIMD Within a Register ). Les processeurs vectoriels peuvent améliorer considérablement les performances pour certaines charges de travail, notamment la simulation numérique , la compression et les tâches similaires.

Les techniques de traitement vectoriel sont également utilisées dans le matériel des consoles de jeux vidéo et dans les accélérateurs graphiques , mais il s'agit invariablement de techniques SIMT ( Single instruction, multiple threads ) et parfois de techniques SIMD ( Single instruction, multiple data ).

Les machines vectorielles sont apparues au début des années 1970 et ont dominé la conception des supercalculateurs tout au long des années 1970 et jusqu'aux années 1990, notamment avec les différentes plateformes Cray . La chute rapide du rapport prix/performances des microprocesseurs classiques a entraîné un déclin des supercalculateurs vectoriels au cours des années 1990.

Westinghouse Electric Corporation, dans le cadre du projet Solomon . L'objectif de Solomon était d'accroître considérablement les performances mathématiques grâce à l'utilisation d'un grand nombre de coprocesseurs simples , contrôlés par une seule unité centrale de traitement (CPU). Cette dernière transmettait une instruction commune à toutes les unités arithmétiques et logiques (UAL), une par cycle, chacune traitant un point de données différent. Ceci permettait à la machine Solomon d'appliquer un algorithme unique à un vaste ensemble de données , fourni sous forme de tableau, ce qui lui a valu d'être citée comme exemple de processeur matriciel dans la taxonomie de Flynn .

En 1962, Westinghouse annula le projet, mais celui-ci fut relancé par l' Université de l'Illinois à Urbana-Champaign sous le nom d' ILLIAC IV . Leur version prévoyait initialement une machine d'une puissance de 1 GFLOPS dotée de 256 unités arithmétiques et logiques (UAL), mais, lors de sa livraison en 1972, elle ne comptait que 64 UAL et sa puissance atteignait seulement 100 à 150 MFLOPS. Néanmoins, elle démontra la validité du concept de base et, utilisée pour des applications gourmandes en données, telles que la dynamique des fluides numérique , l'ILLIAC était la machine la plus rapide au monde. L'approche de l'ILLIAC, consistant à utiliser une UAL distincte pour chaque élément de données, est atypique pour les conceptions ultérieures et est souvent regroupée sous la catégorie distincte du calcul massivement parallèle : vers 1972, Flynn classa ce type de traitement comme une forme primitive de SIMT ( Single Instruction, Multiple Threads ).

International Computers Limited a cherché à éviter bon nombre des difficultés liées au concept ILLIAC avec sa propre conception de processeur à matrice distribuée (DAP), classant l'ILLIAC et le DAP comme des processeurs à matrice cellulaire qui offraient potentiellement des avantages substantiels en termes de performances par rapport aux conceptions de processeurs vectoriels conventionnels tels que le CDC STAR-100 et le Cray 1.

Ordinateur pour opérations avec fonctions

Un ordinateur pour les opérations avec fonctions a été présenté et développé par Kartsev en 1967.

Superordinateurs

STAR-100 de Control Data Corporation et l'Advanced Scientific Computer (ASC) de Texas Instruments , qui ont été introduits respectivement en 1974 et 1972.

L'unité arithmétique et logique (UAL) ASC de base (à un seul pipeline) utilisait une architecture pipeline prenant en charge les calculs scalaires et vectoriels, avec des performances de pointe atteignant environ 20 MFLOPS, facilement obtenues lors du traitement de vecteurs longs. Les configurations UAL étendues prenaient en charge deux ou quatre pipelines, offrant respectivement un gain de performance de 2 ou 4 fois. La bande passante mémoire était suffisante pour supporter ces modes étendus.

Le STAR-100 était certes plus lent que les supercalculateurs de CDC, comme le CDC 7600 , mais pour les tâches liées aux données, il restait performant tout en étant beaucoup plus compact et moins coûteux. Cependant, le décodage des instructions vectorielles et la préparation du traitement prenaient un temps considérable ; il nécessitait donc des jeux de données très spécifiques avant de pouvoir réellement accélérer les opérations.

La technique vectorielle a été pleinement exploitée pour la première fois en 1976 par le célèbre Cray-1 . Contrairement aux STAR-100 et ASC qui stockaient les données en mémoire, le Cray disposait de huit registres vectoriels , chacun contenant soixante-quatre mots de 64 bits. Les instructions vectorielles étaient appliquées entre les registres, ce qui est beaucoup plus rapide que d'accéder à la mémoire principale. Alors que le STAR-100 appliquait une seule opération sur un long vecteur en mémoire avant de passer à l'opération suivante, le Cray chargeait une plus petite section du vecteur dans les registres, puis appliquait autant d'opérations que possible à ces données, évitant ainsi de nombreuses opérations d'accès à la mémoire, beaucoup plus lentes.

L'architecture Cray utilisait le parallélisme pipeline pour implémenter les instructions vectorielles, plutôt que plusieurs unités arithmétiques et logiques (UAL). De plus, elle disposait de pipelines totalement séparés pour chaque instruction ; par exemple, l'addition/soustraction était implémentée sur un matériel différent de celui de la multiplication. Cela permettait d'acheminer un lot d'instructions vectorielles vers chacune des sous-unités UAL, une technique appelée chaînage vectoriel . Le Cray-1 offrait normalement une performance d'environ 80 MFLOPS, mais avec jusqu'à trois chaînes actives, il pouvait atteindre un pic de 240 MFLOPS et une moyenne d'environ 150 MFLOPS – bien plus rapide que n'importe quelle machine de l'époque.

Module processeur Cray J90 avec quatre processeurs scalaires/vectoriels

D'autres exemples suivirent. Control Data Corporation tenta de reconquérir le marché haut de gamme avec sa machine ETA-10 , mais ses ventes furent décevantes, ce qui l'incita à se retirer définitivement du secteur du supercalcul. Au début et au milieu des années 1980, les sociétés japonaises Fujitsu , Hitachi et NEC lancèrent des machines vectorielles à registres similaires au Cray-1, généralement légèrement plus rapides et beaucoup plus compactes : la série Fujitsu VP culmina avec le VP2600, détenteur du record mondial du supercalculateur le plus rapide en 1990-1991. Floating Point Systems (FPS), basée dans l'Oregon , fabriqua des processeurs matriciels additionnels pour mini-ordinateurs , avant de concevoir ses propres mini-supercalculateurs .

Tout au long de cette période, Cray a conservé sa position de leader en matière de performances, surpassant constamment la concurrence grâce à une série de machines qui ont abouti aux Cray-2 , Cray X-MP et Cray Y-MP . Depuis, le marché des supercalculateurs s'est davantage concentré sur le traitement massivement parallèle que sur l'amélioration des processeurs vectoriels. Toutefois, consciente des avantages du traitement vectoriel, IBM a développé l'architecture vectorielle virtuelle (VVA) pour les supercalculateurs, couplant plusieurs processeurs scalaires en un seul processeur vectoriel. IBM a également implémenté le traitement vectoriel de type Cray dans l' IBM 3090, avec une option de traitement vectoriel .

Bien que les supercalculateurs vectoriels de type Cray-1 soient moins répandus aujourd'hui, NEC continue de produire ce type d'ordinateur avec sa série SX . Plus récemment, le SX-Aurora TSUBASA intègre le processeur et 24 ou 48 gigaoctets de mémoire sur un module HBM 2 au sein d'une carte qui ressemble physiquement à un coprocesseur graphique. Cependant, au lieu de jouer ce rôle, il constitue l'ordinateur principal, l'ordinateur compatible PC auquel il est connecté assurant les fonctions de support.

GPU

GPU ) modernes comprennent un ensemble de pipelines de shaders pouvant être pilotés par des noyaux de calcul . Généralement basés sur l'architecture SIMT, ils sont souvent confondus, à tort, avec les processeurs vectoriels, les deux catégories étant très proches dans la taxonomie SIMD de Flynn (1972) . Les GPU utilisent une stratégie pour masquer les latences mémoire, car ils atteignent un niveau extrême de saturation de la mémoire . Comme le montre l' article de Flynn (1972), la principale caractéristique des GPU basés sur SIMT est la présence d'un décodeur-diffuseur d'instructions unique. Les cœurs recevant et exécutant cette même instruction sont par ailleurs relativement classiques : ils possèdent leurs propres unités arithmétiques et logiques (UAL), leurs propres registres, leurs propres unités de chargement/stockage et leurs propres caches de données L1 indépendants. Ainsi, bien que tous les cœurs exécutent simultanément la même instruction de manière synchronisée, ils le font avec des données complètement différentes provenant d'emplacements mémoire distincts. Ce mécanisme est nettement plus complexe que le SIMD « packagé » , qui se limite strictement à l'exécution d'opérations arithmétiques parallèles pipelinées. Bien que les détails internes exacts des GPU commerciaux actuels soient des secrets propriétaires, l'équipe MIAOW a pu rassembler des informations anecdotiques suffisantes pour implémenter un sous-ensemble de l'architecture AMDGPU.

Développements récents

Plusieurs architectures de processeurs modernes sont conçues comme des processeurs vectoriels. L' extension vectorielle RISC-V suit des principes similaires à ceux des premiers processeurs vectoriels et est implémentée dans des produits commerciaux tels que l' AX45MPV d'Andes Technology . Plusieurs architectures de processeurs vectoriels open source sont également en cours de développement, notamment ForwardCom et Libre-SOC .

Comparaison avec les architectures modernes

SIMD dans un registre (SWAR), et processeur pipeliné dans la taxonomie de Flynn. Les exemples courants utilisant SIMD avec des fonctionnalités inspirées des processeurs vectoriels incluent : les instructions MMX , SSE et AVX d'Intel x86 , les extensions 3DNow! d'AMD , ARM NEON , l'extension VIS de Sparc , AltiVec de PowerPC , MSA de MIPS et le processeur Cell .

  • SIMD prédicé - certaines implémentations SIMD prennent en charge la prédication par élément , telles que ARM SVE2 et AVX-512
  • Les processeurs vectoriels purs — selon la classification de Duncan — comprennent le Cray-1 original , les Convex série C , les NEC SX , les Fujitsu série VP , l'unité vectorielle IBM 3090 et le RISC-V RVV . Bien que basés sur la mémoire, le TI ASC et le CDC STAR-100 étaient tous deux des processeurs vectoriels.
  • D'autres conceptions de processeurs incluent des instructions multiples pour le traitement vectoriel sur plusieurs ensembles de données (vectorisées), généralement connues sous le nom de MIMD (instructions multiples, données multiples) et mises en œuvre avec VLIW (mot d'instruction très long) et EPIC (calcul d'instructions parallèle explicite). Le Fujitsu FR-V , par exemple, combine les fonctionnalités VLIW avec la prédication et le SIMD compacté.

    Différence entre les processeurs SIMD et vectoriels

    puissances de deux , et ce depuis leur origine.

    On présente souvent, à tort, le SIMD pur (à largeur fixe, sans prédication) comme étant « vectoriel » (car le SIMD traite des données qui se trouvent être des vecteurs). Une analyse et une comparaison approfondies des ISA historiques et modernes montrent que les ISA vectorielles permettent de définir la longueur du vecteur à l'exécution, et que cette longueur ne peut être une puissance de deux. Autrement dit, le nombre d'éléments n'est pas codé en dur dans l'instruction, contrairement à ce qui se passe dans l'ISA SIMD. Ce point est expliqué dans l'article « SIMD Considered harmun »

    • l'instruction originale Cray-1IBM 3090, l'instruction équivalente était nommée CDC_Cyber#Cyber_200, la longueur du vecteur était partiellement codée dans les registres d'adresse contenant le point de départ en mémoire du vecteur. Le modèle Cyber ​​200 utilisait les 16 premiers bits d'une adresse 64 bits pour coder la longueur du vecteur, pour toutes les sources et les vecteurs de destination.

    Une autre caractéristique importante est le masquage prédictif au niveau des éléments . Dans le modèle Cyber ​​200, le masque binaire au niveau des éléments était lui-même un vecteur stocké en mémoire. Certains processeurs vectoriels possèdent des registres de masque vectoriel, comme le Cray-1 qui, à l'instar du Cyber ​​200, utilisait efficacement un bit par élément comme masque. Cependant, d'autres architectures vectorielles, telles que RISC-V, ont opté pour l'utilisation d'un registre du fichier de registres vectoriels principal.

    Le SIMD prédicatif (qui fait partie de la taxonomie de Flynn ) utilise des masques de prédicats complets au niveau de chaque élément, comme c'est le cas actuellement avec ARM SVE2 et AVX-512 . Cependant, aucun de ces jeux d'instructions ne possède d'instruction explicite permettant de définir la longueur d'un vecteur. Le SIMD prédicatif utilise des ALU SIMD de largeur fixe, mais autorise l'activation locale (prédicative) des unités afin de simuler des vecteurs de longueur variable. Les exemples ci-dessous illustrent ces distinctions.

    Autre différence majeure : le SIMD, utilisant un traitement par lots à largeur fixe, est

    Seymour Cray sur le supercalculateur Cray 1 de 80 MHz en 1976.

    Description

    un code machine aux significations prédéfinies (un jeu d'instructions ). Une instruction d'addition peut, par exemple, effectuer l'opération « additionner A et B et stocker le résultat dans C ». Les données de A, B et C pourraient être, en théorie du moins, directement encodées dans l'instruction. Cependant, en pratique, les choses sont rarement aussi simples. Les données sont rarement transmises brutes ; elles sont plutôt « référencées » par le biais d'une adresse mémoire. Le décodage de cette adresse et l'extraction des données de la mémoire prennent un certain temps, pendant lequel le processeur restait traditionnellement inactif, attendant l'arrivée des données demandées. Avec l'augmentation de la vitesse des processeurs, cette latence mémoire est historiquement devenue un frein important aux performances ; voir pipeline d'instructions. Dans ce système, les instructions transitent successivement par plusieurs sous-unités. La première sous-unité lit l'adresse et la décode, la suivante récupère les valeurs à ces adresses, et la suivante effectue les calculs. L'astuce du pipeline consiste à commencer le décodage de l'instruction suivante avant même que la première n'ait quitté le processeur, à la manière d'une chaîne de montage , ce qui permet au décodeur d'adresses d'être constamment sollicité. Chaque instruction prend le même temps d'exécution, appelé latence , mais le processeur peut traiter un lot entier d'opérations, de manière simultanée, beaucoup plus rapidement et efficacement que s'il les traitait une par une.

    Les processeurs vectoriels poussent ce concept encore plus loin. Au lieu de se contenter de pipeliner les instructions, ils pipelinent également les données elles-mêmes. Le processeur reçoit des instructions qui indiquent non seulement d'additionner A à B, mais aussi d'additionner tous les nombres « d'ici à là » à tous les nombres « de là à là ». Au lieu de devoir constamment décoder les instructions puis récupérer les données nécessaires à leur exécution, le processeur lit une seule instruction en mémoire. La définition même de l'instruction implique qu'elle s'appliquera à nouveau à une autre donnée, à une adresse supérieure d'une unité à la précédente. Ceci maximise considérablement l'efficacité des instructions.

    Pour illustrer l'importance de cette différence, prenons l'exemple simple de l'addition de deux groupes de 10 nombres. Dans un langage de programmation classique, on écrirait une boucle qui parcourrait chaque paire de nombres successivement, puis les additionnerait. Pour le processeur, cela ressemblerait à ceci :

    de processeurs embarqués d'envisager l'utilisation de vecteurs uniquement pour bénéficier de tous les autres avantages, plutôt que de viser des performances élevées.

    De plus, dans les ISA de processeurs vectoriels plus modernes, le « Fail on First » ou « Fault First » a été introduit (voir ci-dessous), ce qui apporte encore plus d'avantages.

    Mais surtout, un processeur vectoriel haute performance peut comporter plusieurs unités fonctionnelles effectuant ces additions en parallèle. La vérification des dépendances entre ces nombres n'est pas nécessaire, car une instruction vectorielle spécifie plusieurs opérations indépendantes. Ceci simplifie la logique de contrôle requise et peut améliorer encore les performances en évitant les blocages. Les opérations mathématiques s'exécutent ainsi beaucoup plus rapidement, le facteur limitant étant le temps nécessaire pour accéder aux données en mémoire.

    Ce type de solution ne permet pas de résoudre tous les problèmes. L'intégration de ces instructions complexifie nécessairement le processeur. Cette complexité a généralement pour conséquence de ralentir l'exécution des autres instructions, notamment lorsqu'il ne s'agit pas d'additionner plusieurs nombres consécutifs. Les instructions plus complexes augmentent également la complexité des décodeurs, ce qui peut ralentir le décodage des instructions plus courantes, comme l'addition classique. ( Ce problème peut être partiellement atténué en conservant l' architecture RISC pour l'ensemble de l'ISA : RVV n'ajoute qu'environ 190 instructions vectorielles, même avec ses fonctionnalités avancées. )

    Les processeurs vectoriels étaient traditionnellement conçus pour fonctionner de manière optimale avec de grands volumes de données. C'est pourquoi on les trouvait principalement dans les supercalculateurs , eux-mêmes généralement installés dans des lieux tels que les centres de prévision météorologique et les laboratoires de physique, où d'énormes quantités de données sont traitées. Cependant, comme indiqué précédemment, l' efficacité des architectures vectorielles présente d'autres avantages non négligeables, même pour les applications embarquées.

    Instructions vectorielles

    x86Videocorepuissances de deux ou provenir de l'un des registres scalaires.

    Le Cray-1 a introduit le concept d'utilisation des registres du processeur pour stocker les données vectorielles par lots. La longueur des lots (longueur du vecteur, VL) pouvait être définie dynamiquement grâce à une instruction spéciale. L'avantage majeur, par rapport au VideoCore IV (et, point crucial comme nous le verrons plus loin, au SIMD également), résidait dans le fait que la longueur de répétition n'avait pas à être intégrée à l'encodage de l'instruction. De cette manière, la capacité de traitement par lots était considérablement accrue ; l'encodage de l'instruction était par ailleurs beaucoup plus élégant et compact. Le seul inconvénient était que, pour exploiter pleinement cette capacité de traitement par lots supplémentaire, la vitesse de chargement et d'écriture en mémoire devait également augmenter. On prétend parfois que série Fujitsu VP a effectivement commis cette erreur : en réalité, cela fait partie intégrante de la recherche d'un débit élevé, comme c'est le cas pour les GPU , qui sont confrontés exactement au même problème.

    Les ordinateurs SIMD modernes prétendent surpasser les premiers Cray en utilisant directement plusieurs unités arithmétiques et logiques (UAL), offrant ainsi un degré de parallélisme supérieur à celui obtenu avec un simple pipeline scalaire. Les processeurs vectoriels modernes (comme le SX-Aurora TSUBASA ) combinent les deux approches en envoyant plusieurs données à plusieurs UAL SIMD internes pipelinées, le nombre d'envois étant déterminé dynamiquement par le programme vectoriel lors de l'exécution. Des masques permettent de charger et de stocker sélectivement des données en mémoire, et de désactiver sélectivement certains éléments de traitement des UAL SIMD. Certains processeurs SIMD ( AVX-512 , ARM SVE2 ) sont capables de ce type de traitement sélectif, élément par élément ( « prédité » ), et ce sont eux qui méritent l'appellation de « processeur vectoriel », ou du moins la prétention d'être capables de « traitement vectoriel ». Les processeurs SIMD sans prédication par élément ( MMX , SSE , AltiVec ) en sont catégoriquement incapables.

    Les GPU modernes, dotés de nombreuses petites unités de calcul, chacune possédant sa propre unité arithmétique et logique SIMD indépendante, utilisent l'architecture SIMT ( Single Instruction Multiple Threads ). Les unités SIMT s'exécutent à partir d'une unité d'instructions unique, synchronisée et diffusée. Les registres vectoriels sont très larges et les pipelines généralement longs. Le « threading » de l'architecture SIMT concerne la manière dont les données sont traitées indépendamment sur chaque unité de calcul.

    De plus, les GPU tels que le Broadcom Videocore IV et d'autres processeurs vectoriels externes comme le NEC SX-Aurora TSUBASA peuvent utiliser moins d'unités vectorielles que leur largeur ne le suggère : au lieu de disposer de 64 unités pour un registre de 64 nombres, le matériel peut effectuer une boucle pipelinée sur 16 unités, selon une approche hybride. Le Broadcom Videocore IV est également capable de cette approche hybride : bien qu'il indique nominalement que son moteur SIMD QPU prend en charge les opérations sur des tableaux FP de 16 bits dans ses instructions, il les effectue en réalité par groupes de 4, comme une autre forme de « threads ».

    Exemple d'instruction vectorielle

    Cet exemple commence par un algorithme (« IAXPY »), présenté d'abord en instructions scalaires, puis en SIMD, puis en SIMD prédité, et enfin en instructions vectorielles. Cette approche progressive permet d'illustrer la différence entre un processeur vectoriel traditionnel et un processeur SIMD moderne. L'exemple débute avec une variante entière 32 bits de la fonction « DAXPY », en C :

    la taxonomie de Flynn ), peut effectuer la plupart des opérations par lots. Le code est globalement similaire à la version scalaire. On suppose ici que x et y sont correctement alignés (on ne commence que sur un multiple de 16) et que n est un multiple de 4, car sinon, du code d'initialisation serait nécessaire pour calculer un masque ou exécuter une version scalaire. On peut également supposer, par souci de simplicité, que les instructions SIMD offrent une option de répétition automatique des opérandes scalaires, comme c'est le cas pour ARM NEON. Dans le cas contraire, une diffusion (« splat ») doit être utilisée pour copier l'argument scalaire dans un registre SIMD.

    AVX-512 , en utilisant les options de gcc .

    Au fil du temps, l'ISA évoluant pour améliorer les performances, les architectes ISA ajoutent successivement des interfaces SIMD à 2 voies, puis à 4 voies, puis à 8 voies, et ainsi de suite. On comprend donc pourquoi AVX-512 existe sur x86.

    Sans prédiction, plus la largeur SIMD est grande, plus les problèmes s'aggravent, entraînant une prolifération massive de codes d'opération, une dégradation des performances, une consommation d'énergie supplémentaire et une complexité logicielle inutile.

    Les processeurs vectoriels, quant à eux, sont conçus pour effectuer des calculs de longueur variable pour un nombre arbitraire n, et nécessitent donc très peu d'initialisation et aucun nettoyage. Même comparés aux architectures SIMD qui utilisent des masques (mais pas avec prédicat (capable de masquage) , et en supposant à nouveau que les instructions SIMD puissent gérer des données mal alignées, la boucle d'instructions ressemblerait à ceci :

    opérations sans effet lors de l'exécution. Ainsi, contrairement au SIMD non prédicat, même en l'absence d'éléments à traiter, aucun code de nettoyage ou préambule n'est généré inutilement : même lorsque n = 0.

    Installation IBM 370 Vector

    Dans l' IBM 3090, un avantage supplémentaire (une réduction supplémentaire du nombre d'instructions) a été obtenu.

    0 "
    VLVCU GR4 # Charger VCT, mettre à jour GR4 et CCode vloop : vld32 v0 , x , v0 # Charger le vecteur x, mettre à jour v0 vld32 v1 , y # Charger le vecteur y (pas de mise à jour de v1) vmadd32 v1 , v0 , a # v1 += v0 * a vst32 v1 , y , v1 # Stocker Y, maintenant mettre à jour v1 VLVCU GR4 # Charger VCT, mettre à jour GR4 et CCode BC 3 , vloop # Retour en arrière si VCT > 0

    L' Libre-SOC , illustré par un exemple DAXPY (virgule flottante 64 bits) :

    de l'ISA Power est utilisé pour le comptage total, au lieu d'un registre scalaire. L' RISC-V comporte 10 instructions, tandis que Libre-SOC et IBM 370, comme indiqué ci-dessus, en comportent tous deux 6 : une réduction de 40 %.

    Exemple de réduction vectorielle

    Cet exemple commence par un algorithme de réduction. Comme dans l'exemple précédent, il sera d'abord présenté en instructions scalaires, puis en SIMD, et enfin en instructions vectorielles, en commençant par le langage C.

    XOP , ont été supprimées après quelques années. Certaines techniques impliquent un brassage : des exemples en ligne nécessitant des connaissances très détaillées sont disponibles pour AVX-512 et SSE sur la façon d'effectuer une « somme horizontale »

    Outre la taille et la complexité du programme, un problème potentiel supplémentaire se pose si des calculs en virgule flottante sont impliqués : le fait que les valeurs ne soient pas additionnées dans un ordre strict (quatre résultats partiels) pourrait entraîner des erreurs d’arrondi.

    Réduction de l'ISA vectorielle

    Les jeux d'instructions vectorielles intègrent des opérations de réduction arithmétique dans l'ISA. Si l'on suppose que n est inférieur ou égal à la longueur maximale du vecteur, seules trois instructions sont nécessaires :

    structure de données contenant plusieurs membres. Ces membres sont extraits de la structure de données (élément) et chacun est placé dans un registre vectoriel différent.
  • Certaines architectures avancées possèdent des variantes de type « fail-first » pour le chargement et le stockage vectoriels standard (expliquées ci-dessous).
  • L'IBM 370 disposait également d'un chargement/stockage vectoriel clairsemé qui utilisait un masque de bits pour spécifier, séquentiellement, quels éléments charger/stocker : en effet le concept de compression/expansion mais avec un registre mémoire au lieu d'un registre (ci-dessous).
  • Opérations masquéesles masques de prédicats permettent d'exécuter des structures if/then/else en parallèle sans recourir à des branchements. Cela permet de vectoriser le code contenant des instructions conditionnelles.
  • Compression et expansion : généralement à l’aide d’un masque de bits, les données sont compressées ou étendues (redistribuées) linéairement selon que les bits du masque sont activés ou désactivés, tout en préservant l’ordre séquentiel et en évitant la duplication des valeurs (contrairement à l’instruction Gather-Scatter, également appelée permutation). Ces instructions sont présentes dans AVX-512 .
  • L'opération de regroupement et de dispersion de registres (ou permutation) est une variante moins restrictive et plus générique de l'opération de compression/expansion. Elle prend un vecteur en paramètre pour spécifier les indices à utiliser afin de « réorganiser » un autre vecteur. Plus complexe à implémenter que la compression/expansion, l'opération de regroupement/dispersion, de par sa nature non séquentielle, peut interférer avec le chaînage de vecteurs . À ne pas confondre avec les modes de chargement/stockage en mémoire de type regroupement/dispersion , les opérations vectorielles de regroupement/dispersion agissent sur les registres vectoriels et sont souvent appelées instructions de permutation.
  • Splat et Extract – utiles pour l'interaction entre scalaire et vecteur, ils diffusent respectivement une seule valeur sur un vecteur ou extraient un élément d'un vecteur.
  • Iota – une instruction très simple et stratégiquement utile qui incrémente séquentiellement des valeurs immédiates dans des éléments successifs. Elle commence généralement à zéro.
  • Réduction et itération – opérations qui appliquent le principe de mapreduce à un vecteur (par exemple, trouver la valeur maximale d'un vecteur ou additionner tous ses éléments). L'itération est de la forme x[i] = y[i] + x[i-1]où la réduction est de la formex = y[0] + y[1]… + y[n-1]
  • La multiplication matricielle , grâce à la prise en charge algorithmique des données en mémoire, au réordonnancement (remappage) de l'accès normalement linéaire aux éléments vectoriels ou à la fourniture d'« accumulateurs », permet de traiter efficacement des matrices de taille arbitraire. IBM POWER10 propose des instructions MMA , mais pour les matrices de largeur arbitraire ne correspondant pas exactement à la taille SIMD, des techniques de répétition de données sont nécessaires, ce qui engendre un gaspillage de ressources de registres . Nvidia fournit une API CUDA de haut niveau pour les matrices, mais ses détails internes ne sont pas disponibles . La technique la plus économe en ressources consiste à réordonner sur place l'accès aux données vectorielles, normalement linéaires.
  • Formats mathématiques avancés – incluant souvent l'arithmétique sur les corps de Galois , mais pouvant également inclure le décimal codé binaire ou le décimal à virgule fixe, et la prise en charge d'opérations arithmétiques beaucoup plus importantes (précision arbitraire) grâce à la gestion parallèle des retenues d'entrée et de sortie
  • Manipulation de bits – y compris les versions vectorisées des opérations de permutation au niveau des bits, l'insertion et l'extraction de champs de bits, les opérations de centrifugation, le comptage de population et bien d'autres .
  • fonctionnalités de traitement vectoriel du GPU

    De nombreuses applications de shaders 3D nécessitant des opérations trigonométriques ainsi que des vecteurs courts pour les opérations courantes (RGB, ARGB, XYZ, XYZW), la prise en charge des éléments suivants est généralement présente dans les GPU modernes, en plus de celle des processeurs vectoriels :

    • Les sous-vecteurs – éléments pouvant généralement contenir deux, trois ou quatre sous-éléments (vec2, vec3, vec4) – sont utilisés. Chaque bit d'un masque de prédicat s'applique à l'ensemble du vecteur vec2/3/4, et non aux éléments du sous-vecteur. Les sous-vecteurs sont également introduits dans RISC-V RVV (sous le nom de « LMUL »). Ils constituent une partie intégrante et essentielle de la spécification Vulkan SPIR-V .
    • Le « swizzle » de sous-vecteurs , également appelé « réarrangement de voies », permet d'effectuer des calculs entre éléments de sous-vecteurs sans nécessiter d'instructions supplémentaires (coûteuses et inutiles) pour déplacer les sous-éléments dans les « voies » SIMD appropriées, et économise également des bits de masque de prédicat. Il s'agit en fait d'une mini-permutation en temps réel du sous-vecteur, très présente dans les binaires des shaders 3D (jusqu'à 20 % de toutes les instructions ) et suffisamment importante pour faire partie de la spécification Vulkan SPIR-V. Le Broadcom Videocore IV utilise la terminologie de « rotation de voies » , tandis que le reste de l'industrie utilise le terme « swizzle » .
    • Les fonctions transcendantes – opérations trigonométriques telles que le sinus , le cosinus et le logarithme – sont évidemment beaucoup plus présentes en 3D que dans de nombreuses charges de travail HPC exigeantes . Il est intéressant de noter que, pour les GPU, la vitesse est bien plus importante que la précision en 3D, car le calcul des coordonnées des pixels ne requiert pas une haute précision. La spécification Vulkan en tient compte et impose des exigences de précision étonnamment faibles, permettant ainsi aux GPU de réduire leur consommation d'énergie. Le concept de réduction de la précision là où elle n'est pas nécessaire est exploré dans l' extension MIPS-3D .

    Défaut (ou échec) en premier

    Le concept de chargements vectoriels séquentiels spéculatifs a été introduit dans ARM SVE2 et RISC-V RVV. ARM SVE2 possède un registre spécial appelé « First Fault Register » où RVV modifie (tronque) la longueur du vecteur (VL)

    Le principe de base de

    Ainsi, même si les performances de l'unité vectorielle sont très élevées ( ), l'accélération reste inférieure à , ce qui suggère que le rapport f est crucial pour les performances. Ce rapport dépend de l'efficacité de la compilation, notamment de la proximité des éléments en mémoire.

    Plus d articles de Worldlex Wiki

    Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

    Explorer l index