Article de reference

Instruction unique, données multiples

Instruction unique, données multiples Le traitement parallèle à instruction unique et données multiples ( SIMD ) est un type de traitement parallèle dans la taxonomie de Flynn ....

Instruction unique, données multiples

Le traitement parallèle à instruction unique et données multiples ( SIMD ) est un type de traitement parallèle dans la taxonomie de Flynn . Le SIMD peut être interne (partie de la conception matérielle) et il peut être directement accessible via une architecture de jeu d'instructions (ISA), mais il ne faut pas le confondre avec une ISA. Le SIMD décrit les ordinateurs dotés de plusieurs éléments de traitement qui exécutent la même opération sur plusieurs points de données simultanément.

Ces machines exploitent le parallélisme au niveau des données , mais pas la concurrence : il y a des calculs simultanés (parallèles), mais chaque unité exécute exactement la même instruction à un moment donné (juste avec des données différentes). SIMD est particulièrement applicable aux tâches courantes telles que le réglage du contraste d'une image numérique ou le réglage du volume de l'audio numérique . La plupart des conceptions de processeurs modernes incluent des instructions SIMD pour améliorer les performances de l'utilisation multimédia . SIMD a trois sous-catégories différentes dans la taxonomie de Flynn de 1972 , dont l'une est SIMT . SIMT ne doit pas être confondu avec les threads logiciels ou les threads matériels , qui sont tous deux des tâches à temps partagé (time-slicing). SIMT est une véritable exécution simultanée au niveau matériel.

Les unités de traitement graphique (GPU) modernes sont souvent des implémentations SIMD larges.

Histoire

La première utilisation des instructions SIMD a eu lieu dans le système ILLIAC IV , achevé en 1966.

Le SIMD a servi de base aux supercalculateurs vectoriels du début des années 1970, tels que le CDC Star-100 et le Texas Instruments ASC , qui pouvaient fonctionner sur un « vecteur » de données avec une seule instruction. Le traitement vectoriel a été particulièrement popularisé par Cray dans les années 1970 et 1980. Les architectures de traitement vectoriel sont désormais considérées comme distinctes des ordinateurs SIMD : la taxonomie de Duncan les inclut alors que la taxonomie de Flynn ne les inclut pas, en raison des travaux de Flynn (1966, 1972) antérieurs au Cray-1 (1977).

La première ère des ordinateurs SIMD modernes était caractérisée par des supercalculateurs de type traitement massivement parallèle tels que les Thinking Machines CM-1 et CM-2 . Ces ordinateurs étaient dotés de nombreux processeurs à fonctionnalités limitées qui fonctionnaient en parallèle. Par exemple, chacun des 65 536 processeurs monobit d'un Thinking Machines CM-2 exécutait la même instruction en même temps, permettant, par exemple, de combiner logiquement 65 536 paires de bits à la fois, en utilisant un réseau connecté à un hypercube ou une RAM dédiée au processeur pour trouver ses opérandes. Le supercalcul s'est éloigné de l'approche SIMD lorsque les approches MIMD scalaires peu coûteuses basées sur des processeurs grand public tels que l' Intel i860 XP sont devenues plus puissantes et que l'intérêt pour la SIMD a diminué.

L'ère actuelle des processeurs SIMD est issue du marché des ordinateurs de bureau plutôt que du marché des superordinateurs. Au cours des années 1990, les processeurs de bureau sont devenus suffisamment puissants pour prendre en charge les jeux en temps réel et le traitement audio/vidéo. La demande pour ce type particulier de puissance de calcul a augmenté et les fournisseurs de microprocesseurs se sont tournés vers SIMD pour répondre à la demande. Hewlett-Packard a introduit les instructions MAX dans les ordinateurs de bureau PA-RISC 1.1 en 1994 pour accélérer le décodage MPEG. Sun Microsystems a introduit les instructions d'entiers SIMD dans ses extensions de jeu d'instructions « VIS » en 1995, dans son microprocesseur UltraSPARC I. MIPS a suivi avec son système MDMX similaire.

Le premier SIMD de bureau largement déployé a été celui des extensions MMX d'Intel pour l' architecture x86 en 1996. Cela a déclenché l'introduction du système AltiVec beaucoup plus puissant dans le PowerPC de Motorola et les systèmes POWER d'IBM . Intel a répondu en 1999 en introduisant le tout nouveau système SSE . Depuis lors, il y a eu plusieurs extensions des jeux d'instructions SIMD pour les deux architectures. Les extensions vectorielles avancées AVX, AVX2 et AVX-512 sont développées par Intel. AMD prend en charge AVX, AVX2 et AVX-512 dans ses produits actuels.

Tous ces développements ont été orientés vers la prise en charge des graphiques en temps réel et sont donc orientés vers le traitement en deux, trois ou quatre dimensions, généralement avec des longueurs de vecteur comprises entre deux et seize mots, selon le type de données et l'architecture. Lorsque les nouvelles architectures SIMD doivent être distinguées des anciennes, les architectures les plus récentes sont alors considérées comme des architectures à « vecteur court », car les anciens supercalculateurs SIMD et vectoriels avaient des longueurs de vecteur de 64 à 64 000. Un supercalculateur moderne est presque toujours un cluster d'ordinateurs MIMD, chacun d'eux implémentant des instructions SIMD (à vecteur court).

Avantages

Une application qui peut tirer parti de la technologie SIMD est celle où la même valeur est ajoutée (ou soustraite) à un grand nombre de points de données, une opération courante dans de nombreuses applications multimédias . Un exemple serait la modification de la luminosité d'une image. Chaque pixel d'une image se compose de trois valeurs pour la luminosité des parties rouge (R), verte (V) et bleue (B) de la couleur. Pour modifier la luminosité, les valeurs R, V et B sont lues dans la mémoire, une valeur leur est ajoutée (ou soustraite) et les valeurs résultantes sont réécrites dans la mémoire. De même, les DSP audio multiplieraient simultanément les canaux gauche et droit pour le contrôle du volume.

Avec un processeur SIMD, ce processus présente deux améliorations. D'une part, les données sont considérées comme étant en blocs et un certain nombre de valeurs peuvent être chargées en une seule fois. Au lieu d'une série d'instructions indiquant « récupérer ce pixel, puis récupérer le pixel suivant », un processeur SIMD disposera d'une seule instruction indiquant en fait « récupérer n pixels » (où n est un nombre qui varie d'une conception à l'autre). Pour diverses raisons, cela peut prendre beaucoup moins de temps que de récupérer chaque pixel individuellement, comme avec une conception de processeur traditionnelle.

Un autre avantage est que l'instruction opère sur toutes les données chargées en une seule opération. En d'autres termes, si le système SIMD fonctionne en chargeant huit points de données à la fois, l' addopération appliquée aux données se produira sur les huit valeurs en même temps. Ce parallélisme est distinct du parallélisme fourni par un processeur superscalaire ; les huit valeurs sont traitées en parallèle même sur un processeur non superscalaire, et un processeur superscalaire peut être capable d'effectuer plusieurs opérations SIMD en parallèle.

Inconvénients

  • Tous les algorithmes ne peuvent pas être vectorisés facilement. Par exemple, une tâche lourde de contrôle de flux comme l' analyse de code peut ne pas facilement bénéficier de SIMD ; cependant, il est théoriquement possible de vectoriser des comparaisons et un « flux par lots » pour cibler l'optimalité maximale du cache, bien que cette technique nécessite davantage d'état intermédiaire. Remarque : les systèmes de pipeline par lots (exemple : GPU ou pipelines de rastérisation logicielle) sont plus avantageux pour le contrôle du cache lorsqu'ils sont implémentés avec des éléments intrinsèques SIMD, mais ils ne sont pas exclusifs aux fonctionnalités SIMD. Une complexité supplémentaire peut être apparente pour éviter la dépendance au sein de séries telles que des chaînes de code ; tandis que l'indépendance est requise pour la vectorisation.
  • Fichiers de registre volumineux qui augmentent la consommation d'énergie et la surface de puce requise.
  • Actuellement, l'implémentation d'un algorithme avec des instructions SIMD nécessite généralement du travail humain ; la plupart des compilateurs ne génèrent pas d'instructions SIMD à partir d'un programme C classique, par exemple. La vectorisation automatique dans les compilateurs est un domaine actif de la recherche en informatique. (Comparer au traitement vectoriel .)
  • La programmation avec des ensembles d’instructions SIMD particuliers peut impliquer de nombreux défis de bas niveau.
    1. SIMD peut avoir des restrictions sur l'alignement des données ; les programmeurs familiers avec une architecture particulière peuvent ne pas s'y attendre. Pire encore : l'alignement peut changer d'une révision ou d'un processeur « compatible » à un autre.
    2. La collecte de données dans des registres SIMD et leur dispersion vers les emplacements de destination corrects est délicate (nécessitant parfois des opérations de permutation ) et peut être inefficace.
    3. Des instructions spécifiques telles que les rotations ou l'addition de trois opérandes ne sont pas disponibles dans certains ensembles d'instructions SIMD.
    4. Les ensembles d'instructions sont spécifiques à l'architecture : certains processeurs manquent entièrement d'instructions SIMD, les programmeurs doivent donc leur fournir des implémentations non vectorisées (ou des implémentations vectorisées différentes).
    5. Les différentes architectures proposent des tailles de registre différentes (par exemple 64, 128, 256 et 512 bits) et des jeux d'instructions différents, ce qui signifie que les programmeurs doivent fournir plusieurs implémentations de code vectorisé pour fonctionner de manière optimale sur un processeur donné. De plus, le nombre possible d'instructions SIMD augmente avec chaque nouvelle taille de registre. Malheureusement, pour des raisons de support hérité, les anciennes versions ne peuvent pas être retirées.
    6. Le premier jeu d'instructions MMX partageait un fichier de registre avec la pile à virgule flottante, ce qui entraînait des inefficacités lors du mélange de codes à virgule flottante et MMX. Cependant, SSE2 corrige ce problème.

Pour remédier aux problèmes 1 et 5, l'extension vectorielle de RISC-V utilise une approche alternative : au lieu d'exposer les détails du niveau sous-registre au programmeur, le jeu d'instructions les résume sous forme de quelques « registres vectoriels » qui utilisent les mêmes interfaces sur tous les processeurs avec ce jeu d'instructions. Le matériel gère tous les problèmes d'alignement et le « strip-mining » des boucles. Les machines avec différentes tailles de vecteurs seraient capables d'exécuter le même code. LLVM appelle ce type de vecteur « vscale ».

Une augmentation d'un ordre de grandeur de la taille du code n'est pas rare, par rapport à un code scalaire ou vectoriel équivalent, et un ordre de grandeur ou une efficacité supérieure (travail effectué par instruction) est réalisable avec les ISA vectoriels.

L'extension vectorielle évolutive d'ARM adopte une autre approche, connue dans la taxonomie de Flynn sous le nom de « traitement associatif », plus communément appelé aujourd'hui SIMD « prédiqué » (masqué) . Cette approche n'est pas aussi compacte que le traitement vectoriel , mais reste bien meilleure que le SIMD non prédiqué. Des exemples comparatifs détaillés sont donnés dans la page Traitement vectoriel .

Chronologie

Exemples de supercalculateurs SIMD (sans compter les processeurs vectoriels )
Année Exemple
1974 ILLIAC IV
1974 Processeur de réseau distribué ICL (DAP)
1976 Processeur scientifique Burroughs
1981 Processeur parallèle géométrique-arithmétique de Martin Marietta (continué chez Lockheed Martin , puis chez Teranex et Silicon Optix )
1983-1991 Processeur massivement parallèle (MPP), de la NASA / Goddard Space Flight Center
1985 Machine de connexion , modèles 1 et 2 (CM-1 et CM-2), de Thinking Machines Corporation
1987-1996 MasPar MP-1 et MP-2
1991 Zephyr DC de Wavetracer
2001 Xplor de Pyxsys, Inc.

Matériel

Les instructions SIMD à petite échelle (64 ou 128 bits) sont devenues populaires sur les processeurs à usage général au début des années 1990 et ont continué jusqu'en 1997 et plus tard avec les instructions Motion Video (MVI) pour Alpha . Les instructions SIMD peuvent être trouvées, à un degré ou à un autre, sur la plupart des processeurs, y compris AltiVec et SPE d' IBM pour PowerPC , les extensions d'accélération multimédia PA-RISC (MAX) de HP , les MMX et iwMMXt d' Intel , SSE , SSE2 , SSE3 SSSE3 et SSE4.x , 3DNow! d' AMD , le sous-système vidéo ARC d'ARC, VIS et VIS2 de SPARC , MAJC de Sun , la technologie Neon d' ARM , MDMX (MaDMaX) de MIPS et MIPS-3D . Le jeu d'instructions du processeur SPU développé conjointement par IBM, Sony et Toshiba est fortement basé sur SIMD. Philips , aujourd'hui NXP , a développé plusieurs processeurs SIMD appelés Xetal . Le Xetal dispose de 320 éléments de processeur 16 bits spécialement conçus pour les tâches de vision.

Les instructions AVX-512 SIMD d'Intel traitent 512 bits de données à la fois.

Logiciel

Triplement ordinaire de quatre nombres de 8 bits. Le processeur charge un nombre de 8 bits dans R1, le multiplie par R2, puis enregistre la réponse de R3 dans la RAM. Ce processus est répété pour chaque nombre.
Le triplement SIMD de quatre nombres de 8 bits. Le processeur charge 4 nombres à la fois, les multiplie tous en une seule multiplication SIMD et les enregistre tous en même temps dans la RAM. En théorie, la vitesse peut être multipliée par 4.

Les instructions SIMD sont largement utilisées pour traiter les graphiques 3D, bien que les cartes graphiques modernes avec SIMD intégré aient largement pris en charge cette tâche du processeur. Certains systèmes incluent également des fonctions de permutation qui reconditionnent les éléments à l'intérieur des vecteurs, ce qui les rend particulièrement utiles pour le traitement et la compression des données. Elles sont également utilisées en cryptographie. La tendance du calcul à usage général sur les GPU ( GPGPU ) pourrait conduire à une utilisation plus large de SIMD à l'avenir.

L'adoption des systèmes SIMD dans les logiciels pour ordinateurs personnels a d'abord été lente, en raison d'un certain nombre de problèmes. L'un d'eux était que de nombreux jeux d'instructions SIMD avaient tendance à ralentir les performances globales du système en raison de la réutilisation des registres à virgule flottante existants. D'autres systèmes, comme MMX et 3DNow! , offraient un support pour des types de données qui n'intéressaient pas un large public et disposaient d'instructions de changement de contexte coûteuses pour basculer entre l'utilisation des registres FPU et MMX . Les compilateurs manquaient également souvent de support, obligeant les programmeurs à recourir au codage en langage assembleur .

Le démarrage de SIMD sur x86 a été lent. L'introduction de 3DNow! par AMD et de SSE par Intel a quelque peu perturbé les choses, mais aujourd'hui le système semble s'être stabilisé (après l'adoption de SSE par AMD) et les nouveaux compilateurs devraient permettre de produire davantage de logiciels compatibles SIMD. Intel et AMD fournissent désormais tous deux des bibliothèques mathématiques optimisées qui utilisent les instructions SIMD, et des alternatives open source comme libSIMD, SIMDx86 et SLEEF ont commencé à apparaître (voir aussi libm ).

Apple Computer a connu un peu plus de succès, même s'ils sont entrés sur le marché SIMD plus tard que les autres. AltiVec offrait un système riche et pouvait être programmé à l'aide de compilateurs de plus en plus sophistiqués de Motorola , IBM et GNU , de sorte que la programmation en langage assembleur était rarement nécessaire. De plus, de nombreux systèmes qui auraient pu bénéficier de SIMD étaient fournis par Apple lui-même, par exemple iTunes et QuickTime . Cependant, en 2006, les ordinateurs Apple sont passés aux processeurs Intel x86. Les API et les outils de développement d'Apple ( XCode ) ont été modifiés pour prendre en charge SSE2 et SSE3 ainsi qu'AltiVec. Apple était le principal acheteur de puces PowerPC d'IBM et de Freescale Semiconductor . Même si Apple a arrêté d'utiliser des processeurs PowerPC dans ses produits, le développement d'AltiVec se poursuit dans plusieurs conceptions PowerPC et Power ISA de Freescale et IBM.

SIMD dans un registre , ou SWAR , est une gamme de techniques et d'astuces utilisées pour exécuter SIMD dans des registres à usage général sur du matériel qui ne fournit aucune prise en charge directe des instructions SIMD. Cela peut être utilisé pour exploiter le parallélisme dans certains algorithmes même sur du matériel qui ne prend pas directement en charge SIMD.

Interface du programmeur

Il est courant que les éditeurs des jeux d'instructions SIMD créent leurs propres extensions de langage C/C++ avec des fonctions intrinsèques ou des types de données spéciaux (avec surcharge d'opérateur ) garantissant la génération de code vectoriel. Intel, AltiVec et ARM NEON fournissent des extensions largement adoptées par les compilateurs ciblant leurs processeurs. (Les opérations plus complexes sont la tâche des bibliothèques mathématiques vectorielles.)

Le compilateur GNU C va encore plus loin en les abstrayant dans une interface universelle qui peut être utilisée sur n'importe quelle plate-forme en fournissant un moyen de définir les types de données SIMD. Le compilateur LLVM Clang implémente également la fonctionnalité, avec une interface analogue définie dans l'IR. La caisse de Rust packed_simd(et l'expérimental std::sims) utilise cette interface, tout comme Swift 2.0+.

C++ possède une interface expérimentale std::experimental::simdqui fonctionne de manière similaire à l'extension GCC. La bibliothèque libcxx de LLVM semble l'implémenter. Pour GCC et libstdc++, une bibliothèque wrapper qui s'appuie sur l'extension GCC est disponible.

Microsoft a ajouté SIMD à .NET dans RyuJIT. Le System.Numerics.Vectorpackage, disponible sur NuGet, implémente les types de données SIMD. Java dispose également d'une nouvelle API proposée pour les instructions SIMD disponibles dans OpenJDK 17 dans un module d'incubation. Il dispose également d'un mécanisme de secours sécurisé sur les processeurs non pris en charge vers des boucles simples.

Au lieu de fournir un type de données SIMD, les compilateurs peuvent également être invités à vectoriser automatiquement certaines boucles, en prenant potentiellement en compte certaines assertions sur l'absence de dépendance des données. Ce n'est pas aussi flexible que la manipulation directe des variables SIMD, mais c'est plus facile à utiliser. OpenMP 4.0+ a une astuce. [17] Cette interface OpenMP a remplacé un large ensemble d'extensions non standard, y compris Cilk , [ 18 #pragma omp simd] et bien d' . [ #pragma simd#pragma GCC ivdep

Versionnage multi-version SIMD

Les logiciels grand public sont généralement censés fonctionner sur une gamme de processeurs couvrant plusieurs générations, ce qui pourrait limiter la capacité du programmeur à utiliser de nouvelles instructions SIMD pour améliorer les performances de calcul d'un programme. La solution consiste à inclure plusieurs versions du même code qui utilisent des technologies SIMD plus anciennes ou plus récentes, et à choisir celle qui correspond le mieux au processeur de l'utilisateur au moment de l'exécution ( répartition dynamique ). Il existe deux principaux camps de solutions :

  • Fonction multi-versioning (FMV) : une sous-routine du programme ou une bibliothèque est dupliquée et compilée pour de nombreuses extensions de jeu d'instructions, et le programme décide laquelle utiliser au moment de l'exécution.
  • Multi-versioning de bibliothèque (LMV) : l'intégralité de la bibliothèque de programmation est dupliquée pour de nombreuses extensions de jeu d'instructions, et le système d'exploitation ou le programme décide lequel charger au moment de l'exécution.

FMV, codé manuellement en langage assembleur, est assez couramment utilisé dans un certain nombre de bibliothèques critiques pour les performances telles que glibc et libjpeg-turbo. Intel C++ Compiler , GNU Compiler Collection depuis GCC 6 et Clang depuis clang 7 permettent une approche simplifiée, le compilateur se chargeant de la duplication et de la sélection des fonctions. GCC et clang nécessitent target_clonesdes étiquettes explicites dans le code pour « cloner » les fonctions, tandis qu'ICC le fait automatiquement (sous l'option de ligne de commande /Qax). Le langage de programmation Rust prend également en charge FMV. La configuration est similaire à GCC et Clang dans la mesure où le code définit les ensembles d'instructions à compiler, mais le clonage est effectué manuellement via l'inlining.

Comme l'utilisation de FMV nécessite une modification du code sur GCC et Clang, les fournisseurs utilisent plus couramment le multiversioning de bibliothèque : cela est plus facile à réaliser car seuls les commutateurs du compilateur doivent être modifiés. Glibc prend en charge LMV et cette fonctionnalité est adoptée par le projet Clear Linux soutenu par Intel.

SIMD sur le Web

En 2013, John McCutchan a annoncé qu'il avait créé une interface hautes performances pour les jeux d'instructions SIMD pour le langage de programmation Dart , apportant pour la première fois les avantages de SIMD aux programmes Web. L'interface se compose de deux types :

  • Float32x4, 4 valeurs à virgule flottante simple précision.
  • Int32x4, 4 valeurs entières de 32 bits.

Les instances de ces types sont immuables et, dans le code optimisé, sont mappées directement sur les registres SIMD. Les opérations exprimées en Dart sont généralement compilées en une seule instruction sans aucune surcharge. Cela est similaire aux intrinsèques C et C++. Les tests de performance pour la multiplication de matrices 4×4 , la transformation de vertex 3D et la visualisation de l'ensemble de Mandelbrot montrent une accélération de près de 400 % par rapport au code scalaire écrit en Dart.

Le travail de McCutchan sur Dart, désormais appelé SIMD.js, a été adopté par ECMAScript et Intel a annoncé lors de l'IDF 2013 qu'ils implémentaient la spécification de McCutchan pour V8 et SpiderMonkey . Cependant, en 2017, SIMD.js a été retiré de la file d'attente standard ECMAScript au profit de la recherche d'une interface similaire dans WebAssembly . En août 2020, l'interface WebAssembly reste inachevée, mais sa fonction SIMD 128 bits portable a déjà été utilisée dans de nombreux moteurs.

Emscripten, le compilateur C/C++ vers JavaScript de Mozilla, avec des extensions peut permettre la compilation de programmes C++ qui utilisent des éléments intrinsèques SIMD ou du code vectoriel de style GCC vers l'API SIMD de JavaScript, ce qui entraîne des accélérations équivalentes par rapport au code scalaire. Il prend également en charge (et préfère désormais) la proposition SIMD 128 bits de WebAssembly.

Applications commerciales

Il s’est généralement avéré difficile de trouver des applications commerciales durables pour les processeurs SIMD uniquement.

Le GAPP , développé par Lockheed Martin et commercialisé par sa filiale Teranex, a connu un certain succès . Les incarnations récentes du GAPP sont devenues un outil puissant dans les applications de traitement vidéo en temps réel comme la conversion entre différentes normes vidéo et fréquences d'images ( NTSC vers/depuis PAL , NTSC vers/depuis les formats HDTV , etc.), le désentrelacement , la réduction du bruit d'image , la compression vidéo adaptative et l'amélioration d'image.

Une application plus répandue du SIMD se trouve dans les jeux vidéo : presque toutes les consoles de jeux vidéo modernes depuis 1998 ont intégré un processeur SIMD quelque part dans leur architecture. La PlayStation 2 était inhabituelle dans le sens où l'une de ses unités vector-float pouvait fonctionner comme un DSP autonome exécutant son propre flux d'instructions, ou comme un coprocesseur piloté par des instructions CPU ordinaires. Les applications graphiques 3D ont tendance à bien se prêter au traitement SIMD car elles s'appuient fortement sur des opérations avec des vecteurs à 4 dimensions. Direct3D 9.0 de Microsoft choisit désormais au moment de l'exécution des implémentations spécifiques au processeur de ses propres opérations mathématiques, y compris l'utilisation d'instructions compatibles SIMD.

Un processeur plus récent qui utilisait le traitement vectoriel est le processeur Cell utilisé dans la Playstation 3, qui a été développé par IBM en coopération avec Toshiba et Sony . Il utilise un certain nombre de processeurs SIMD (une architecture NUMA , chacun avec une mémoire locale indépendante et contrôlé par un processeur à usage général) et est adapté aux énormes ensembles de données requis par les applications de traitement 3D et vidéo. Il diffère des ISA traditionnels en étant SIMD dès le départ, sans registres scalaires séparés.

Ziilabs a produit un processeur de type SIMD destiné à être utilisé sur des appareils mobiles, tels que des lecteurs multimédias et des téléphones mobiles.

Des processeurs SIMD commerciaux à plus grande échelle sont disponibles auprès de ClearSpeed ​​Technology, Ltd. et Stream Processors, Inc. Le CSX600 (2004) de ClearSpeed ​​possède 96 cœurs chacun avec deux unités à virgule flottante double précision tandis que le CSX700 (2008) en possède 192. Stream Processors est dirigé par l'architecte informatique Bill Dally . Leur processeur Storm-1 (2007) contient 80 cœurs SIMD contrôlés par un processeur MIPS.