• Aucun résultat trouvé

Architecture de von Neumann et ses successeurs utilisés pour le calcul stream

3.4 Modèle stream du calcul et les architectures associées

3.4.3 Architecture de von Neumann et ses successeurs utilisés pour le calcul stream

Les machines du calcul que nous connaissons aujourd’hui en tant que GPP sont basées sur l’archi- tecture de von Neumann qui se caractérise par un bloc d’unité centrale (CPU) qui assure le calcul, par un bloc de mémoire commune pour les données et pour les instructions et par un bus qui relie ces deux blocs ensemble. La figure 3.13 présente la structure de l’architecture du type von Neumann avec la mémoire cache présente dans le CPU.

Mémoire principale CPU Mémoire(s) cache ALU MEM BUS Registres Unité de contrôle

FIG. 3.13 : Schéma de l’architecture von Neumann avec une mémoire cache incorporée dans l’unité centrale, CPU - bloc d’unité centrale, MEM - bloc de la mémoire, BUS - bus assurant la liaison de l’unité centrale à la mémoire

Il faut mentionner intensément que l’architecture de von Neumann n’est pas une architecture paral- lèle. Elle était conçue pour l’exécution d’un code séquentiel et dans sa version d’origine, elle n’est pas du tout adaptée à un calcul sur les streams. Notons que le code parallèle est exécuté en séquence sur

1 Imagine Stream ProcessorORK+02, KDK+01, KDR+02, KRD+03

, implémenté physiquement en silicium sur la puce dont la surface était 2,6 cm2

cette architecture et nous n’exploitons pas du tout les avantages d’un possible parallélisme. Le goulot d’étranglement principal et en même temps un grand désavantage de cette architecture est la manière d’accéder aux données dans la mémoire où celles-ci sont obligées de circuler dans les deux sens entre la mémoire et l’unité du calcul. La mémoire cache présente sur la puce dans le bloc CPU est déjà une technique utilisée pour diminuer l’impact de ce goulot d’étranglement.

En revanche, les architectures à flux de données n’utilisent pas deux concepts fondamentaux de l’architecture de von Neumann – le compteur des instructions (angl. Program counter), qui est propre au traitement séquentiel, et le stockage global des données dans un système de mémoire composé d’une hiérarchie plus ou moins complexe des mémoires.

Les solutions qui seraient convenables à la fois pour le calcul en séquence et pour le calcul sur les streams et qui essayaient de combiner l’architecture de von Neumann et l’architecture de flux de données ont été également étudiées, surtout dans les années 1980. Diverses réalisations qui travaillaient avec différents niveaux de granularité ont été présentées ; comme exemple nous pouvons citer l’architecture hybride décrite dans la thèse de IannucciIan88en 1988.

De nos jours, l’approche percevant l’exécution du code dans le temps comme des fils d’exécution (angl. thread) a largement changé le point de vue sur la structure originale de l’architecture de von Neumann et a orienté l’évolution des architectures GPP basées sur cette dernière vers les architectures adaptées au travail avec les flux de données – architectures multithread. Pour plus d’information sur le rapprochement entre des architectures à flux et des architectures multithread, nous invitons le lecteur se référer à un articleSRU01 qui étudie ce point précis très en détail. Pour plus de détails généraux sur les

diverses architectures des ordinateurs et sur leurs conceptions, nous adressons le lecteur à une des livres de William Stallings, e.g. la septième1éditionSta06.

3.4.3.2 Fils d’exécution et multitâche

Percevoir l’exécution sur un ordinateur à travers des processus distincts (on parle aussi des tâches) est la pratique couramment utilisée dans les systèmes logiciels qui doivent assurer l’exécution des pro- grammes ou routines d’une façon concurrente. Ils doivent souvent gérer la priorité, notamment dans les cas où il est important de livrer les résultats d’une tâche soit le plus tôt possible, soit dans un temps prédéfini, soit plus tôt que le résultat d’une autre tâche. L’exemple le plus marquant de travail avec les processus que nous appelons également travail multitâche sont les systèmes d’exploitation multitâches dans les ordinateurs. Mais nous pouvons trouver le même style de travail aussi dans les systèmes informa- tiques pour l’automatisation industrielle où les tâches sont également concurrentes et de plus, la demande d’obtention des résultats dans un temps prédéfini est cruciale et dicté par la nature de la technologie à contrôler.

Pour exploiter le parallélisme à une échelle plus petite à l’intérieur d’un processus, les fils d’exécu- tionou autrement dits les processus légersWik06j (angl. threads) sont utilisés. La différence entre les fils

d’exécution et le multitâche classique réside dans le fait que les processus classiques sont typiquement indépendants les uns des autres et communiquent en utilisant une interface fournie par le système. En revanche, les fils d’exécution peuvent partager des information sur l’état du processus auquel ils appar- tiennent, les espaces de la mémoire ainsi que d’autres ressources. L’exemple trivial d’exécution en fil est celui d’un processus constitué d’un seul fil d’exécution, d’un single thread. Dans les autres cas, nous parlons d’un processus à plusieurs fils d’exécution, d’un processus multithread (MT).

L’architecture matérielle qui effectue l’exécution peut être, et pour les GPP fut longtemps, l’archi- tecture de von Neumann. Puisqu’il ne s’agit pas de l’architecture parallèle, l’aspect concurrent d’exécu- tion disparaît, le temps du processeur est distribué par portions entre les fils et l’exécution se poursuit d’une façon séquentielle. Mais à l’échelle du temps moins précise, l’exécution des fils est perçue comme concurrente. Dans ce cas nous parlons du multithreading virtuel (VMT).

(a)Multiprocessing sur un processeur

(b)Multiprocessing sur plusieurs processeurs, les processus sont exécutés concurremmet

FIG. 3.14 : Exécution de plusieurs processus sur les architectures différentes (selon StallingsSta06)

Si les fils peuvent être exécutés en même temps, nous parlons du multithreading simultané (SMT). Sur les architectures où l’aspect parallèle d’exécution est présent et qui peuvent lancer plusieurs ins- tructions de plusieurs fils d’exécution, nous parlons du Chip-level MultiThreading (CMT). Si plusieurs processeurs sont intégrés dans une seule puce, nous parlons de multiprocessing au niveau de la puce (CMP) ou de plusieurs cœurs (angl. multicore).

La sauvegarde de l’état d’un fil d’exécution suivie par la restauration de l’état d’un autre fil qui pour- suivra l’occupation des ressources communes lors de l’exécution concourante est nommée le changement du contexte. Il peut être moins coûteux, mesuré par la durée de ce changement, sur les architectures qui partagent certaines ressources matérielles comme la mémoire cache, par exemple. C’est souvent le cas pour le multithreading simultané dans les applications multimédia.

3.4.3.3 Architectures à fils d’exécution

Les architectures matérielles se sont adaptées à cette façon de travailler et ont procédé aux améliora- tions en éliminant progressivement les goulots d’étranglement qui freinaient les applications logicielles de ce type.

Dans un premier temps, l’effort s’est concentré sur les unités de préparation d’exécution des ins- tructions. Ces unités travaillent en pipeline qui peut être relativement long1. Durant le travail avec les

threads, le changement du contexte provoque le vidage de ce pipeline et un nouveau remplissage par l’état restauré appartenant au nouveau thread. Ce qui cause, en effet, la perte du temps. Cette perte est di- rectement proportionnée, à travers les cycles d’horloges nécessaires pour remplir le pipeline à nouveau, à la longueur de ce pipeline et à la fréquence de changements des contextes. Ce qui défavorise forte- ment les applications travaillant fréquemment avec les threads. Pour diminuer cette perte, la solution se trouve dans la multiplication du nombre de ces pipelines. Les processeurs qui ont adopté cette solution implémentent, en effet, le multithreading simultané. La technologie de ce type développée par Intel est nommée Hyper-Threading TechnologyMBH+02

.

La fig. 3.15 présente le schéma de la structure d’une telle architecture. Remarquons que ces tech- nologies, que nous classons sous CMT, ne sont pas destinées uniquement aux processus légers mais exploitent aussi bien le parallélisme des processus distincts lors d’un travail multitâche.

Les solutions récentes utilisent cette idée et ont aussi étendu la multiplication matérielle aussi aux unités centrales entières. C’est ainsi que nous avons aujourd’hui à notre disposition les architectures à

1 Tejas, le prototype du successeur du Intel Pentium 4, dont le développement a été abandonné, possédait un pipeline de 31

Mémoire principale CPU MEM BUS Registres Registres Unité de contrôle (pipeline) LP1 Unité de contrôle (pipeline) LP2 ALU Mémoire(s) cache

FIG. 3.15 : Architecture hyper-threading, CPU - bloc d’unité centrale, MEM - bloc de la mémoire, BUS - bus

liant l’unité centrale avec la mémoire, LP- processeur logique

plusieurs cœurs qui implémentent plusieurs unités centrales à l’intérieur d’une seule puce. Si les cœurs eux-mêmes implémentent le multithreading simultané, nous pouvons parler de la combinaison du mul- tiprocessing, CMP, et du multithreading, CMT, au niveau de la puce. La fig. 3.16 illustre cette situation sur un processeur avec deux cœurs où chaque cœur implémente aussi le multithreading simultané. Nous pouvons citer comme représentant les processeurs avec deux cœurs d’IntelInt06d ou d’AMDAMD06et le

processeur à basse consommation avec quatre cœurs d’ARMARM06.

Mémoire principale MEM BUS CPU1 Registres Registres Unité de contrôle (pipeline) LP1 Unité de contrôle (pipeline) LP2 ALU Mémoire(s) cache CPU2 Registres Registres Unité de contrôle (pipeline) LP3 Unité de contrôle (pipeline) LP4 ALU Mémoire(s) cache

FIG. 3.16 : Architecture hyper-threading avec deux cœurs, CPU - bloc d’unité centrale, MEM - bloc de la

mémoire, BUS - bus liant l’unité centrale avec la mémoire, LP- processeur logique

Ces solutions présentent l’aspect parallèle et nous pouvons les classer parmi les architectures MIMD avec la mémoire partagée. La philosophie de construction a changé, on est en train de travailler en parallèle mais nous pouvons toujours distinguer les bases de l’architecture de von Neumann – un bloc de mémoire d’un côté et un bloc d’unité centrale, même complexe et avec deux cœurs, de l’autre.