Single Instruction Multiple Data

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis SIMD)
Aller à : Navigation, rechercher
Principe du mode SIMD

Single Instruction on Multiple Data, ou SIMD est une des quatre catégories d'architecture définies par la taxinomie de Flynn et désigne un mode de fonctionnement des ordinateurs dotés de plusieurs unités de calcul fonctionnant en parallèle. Dans ce mode, la même instruction est appliquée simultanément à plusieurs données pour produire plusieurs résultats.

On utilise cette abréviation par opposition à SISD (Single Instruction on Single Data), le fonctionnement traditionnel, et MIMD (Multiple Instructions on Multiple Data), le fonctionnement avec plusieurs processeurs indépendants.

Sommaire

Utilisation [modifier]

Le modèle SIMD convient particulièrement bien aux traitements dont la structure est très régulière, comme c'est le cas pour le calcul matriciel. Généralement, les applications qui profitent des architectures SIMD sont celles qui utilisent beaucoup de tableaux, de matrices, ou de structures de données du même genre. On peut notamment citer les applications scientifiques, ou de traitement du signal.

Implémentation matérielle [modifier]

L'implémentation matérielle du paradigme SIMD peut se faire de diverses façons :

  • via l’utilisation d'instructions SIMD ;
  • par des processeurs vectoriels ;
  • par des Streams Processors ;
  • ou via des systèmes multicoeurs ou multiprocesseurs.

Dans les trois premiers cas, un seul processeur peut naturellement exécuter une opération identique sur des données différentes.

Dans le dernier cas, chaque processeur va effectuer une seule opération sur une donnée. Le parallélisme SIMD vient donc de l’utilisation de plusieurs processeurs.

Instructions SIMD [modifier]

Ces instructions sont des instructions qui peuvent effectuer plusieurs opérations en parallèles, sur des données différentes.

Les opérations en question peuvent être :

  • des opérations bit à bit, comme des ET, OU, NOT bitwise ;
  • des additions ;
  • des soustractions ;
  • des multiplications ;
  • éventuellement des divisions ;
  • ou des opérations mathématiques plus complexes.
Exemple d'execution d'une instruction vectorielle d'addition

Toutes ces instructions SIMD travaillent sur un ensemble de données de même taille et de même type. Ces données sont rassemblées dans des espèces de blocs de données, d'une taille fixe, qu'on appelle un vecteur. Ces vecteurs contiennent plusieurs nombres entiers ou nombres flottants placés les uns à coté des autres.

Une instruction SIMD va traiter chacune des données du vecteur indépendamment des autres. Par exemple, une instruction d'addition SIMD va additionner ensemble les données qui sont à la même place dans deux vecteurs, et placer le résultat dans un autre vecteur, à la même place. Quand on exécute une instruction sur un vecteur, les données présentes dans ce vecteur sont traitées simultanément.

Tous les processeurs modernes contiennent des extensions à leur jeu d'instruction, comme le MMX, le SSE, etc. Ces extensions ont été ajoutées aux processeurs modernes pour pouvoir améliorer la vitesse de traitement sur les calculs. Les instructions SIMD sont composées notamment des jeux d'instructions :

Registres SIMD [modifier]

Les vecteurs traités par ces instructions sont souvent placés dans des registres à part, spécialisés dans le stockage des vecteurs. Ceux-ci ont souvent une taille assez importante, environ 128 à 256 bits.

Toutefois, certains processeurs utilisent leurs registres généraux pour stocker ces vecteurs. Ils ne disposent donc pas forcément de registres spécialisés, et les registres normaux sont utilisés pour maintenir des vecteurs. Les instructions SIMD travaillent alors sur les mêmes registres que leurs congénères non-SIMD. On appelle cette forme d'instructions SIMD du micro-SIMD.

Usage pour l'optimisation [modifier]

Les programmes qui sont optimisés avec ce genre d'instructions sont ceux qui demandent beaucoup de ressources processeur : compression de données, codec pour la lecture de son et/ou de vidéo, calcul sur de grands nombres entiers (cryptographie notamment), etc.

En général, ces instructions sont utilisées directement par les programmeurs. Ceux-ci écrivent des morceaux de code assembleur dans leurs programmes afin de pouvoir profiter au maximum des optimisations permises par les instructions SIMD. Ceux-ci commencent par développer un code générique qui fonctionnera partout. Quand l'algorithme est correct, ils écrivent une version spécialisée pour une extension d'un processeur donné. L'utilisation de ces instruction demande donc beaucoup de travail et des connaissances approfondies en assembleur.

Certains compilateurs et certaines bibliothèques permettent de bénéficier de ces optimisations sans coder en assembleur. On peut noter que le projet Mono par exemple profite de ces optimisations processeur si l'on utilise les classes adaptées. (fr) Présentation de Mono 2.2 intégrant SIMD. Mais il faut toutefois signaler que l'optimisation manuelle, effectuée par des programmeurs donne de meilleurs résultats que des optimisations effectuées par le compilateur. [1]

Processeurs vectoriels [modifier]

Article détaillé : Processeur_vectoriel.

Les processeurs vectoriels peuvent êtres vus comme des processeurs incorporant des instructions SIMD, avec quelques améliorations annexes. Par exemple, ces processeurs n'imposent pas de restrictions d'alignements pour les instructions SIMD d'accès mémoire. De plus, les instructions d'accès mémoire supportent des modes d'accès à la mémoire supplémentaires, comme les accès stridés ou en scatter-gather.

Streams processors [modifier]

Les Streams processors, ou processeurs de flux, peuvent êtres vus comme des processeurs vectoriels ayant une hiérarchie de registres, et qui supportent le Simultaneous Multithreding.

Paradigme logiciel [modifier]

Afin de faciliter d'utilisation des architectures SIMD, divers langages ont été inventés. Ces langages cherchent à rendre le parallélisme de donnée utilisable plus facilement par les compilateurs.

Dans les langages procéduraux actuels, les compilateurs ont du mal à déterminer si des instructions travaillent sur des données indépendantes ou non. En conséquence, les compilateur peuvent rater certaines opportunités d'utilisations d'instructions SIMD ou d'instructions vectorielles. C'est pour éviter au maximum ce genre de situations que certains langages SIMD ont été inventés.

Parmi ces langages, on peut citer :

  • Le langage CUDA. Ce langage permet l'utilisation des cartes graphiques pour le calcul numérique, et on y trouve de nombreuses instructions qui agissent sur plusieurs données en même temps.

Références [modifier]

  1. http://www.hardware.fr/articles/847-14/impact-assembleur-x264.html