1.7 Conclusion
2.1.4 Types d’architectures
Les principales architectures d’ordinateur sont les architectures Von Neumann, Harvard
et sa variante dite Harvard modifiée. Elles diffèrent principalement dans leur manière de
structurer les accès mémoire aux données et aux instructions.
L’architecture de Von Neumann a pour particularité de disposer d’une unique structure
pour stocker les données et instructions. Instructions et données partagent ainsi les mêmes
bus et le même espace d’adressage. L’inconvénient de cette architecture est que le partage
d’un même bus pour les données et les instructions forme un goulot d’étranglement qui
peut nuire aux performances.
L’architecture de typeHarvard, quant à elle, sépare physiquement la mémoire des données
et la mémoire d’instructions. L’accès se fait en utilisant des bus séparés ce qui permet
d’accéder en même temps à une instruction et une donnée. Ceci apporte ainsi un gain de
performance comparé à une architecture de typeVon Neumann.
Cette architecture a ensuite été modifiée pour utiliser un même espace d’adressage pour
les deux mémoires tout en conservant deux bus distincts. Très souvent, les données et
instructions sont stockées au même endroit. Cette architecture permet cependant d’utiliser
des caches séparés entre les instructions et les données comme le montre la figure 2.5. La
présence de caches séparés peut éviter un goulot d’étranglement au niveau de la mémoire
centrale ou d’un unique cache. Cette architecture est appelée Harvard Modifiée.
En pratique, la plupart des processeurs actuels sont de typeHarvard Modifié à l’exception
de quelques systèmes. C’est par exemple le cas du ARM7, de type Von Neumann, pour
lequel les données et instructions sont stockées au même endroit et où la présence de
2.1. Fonctionnement d’un processeur 41
Processeur M´emoire
Cache Instructions Cache donn´ees
Figure 2.5 – Exemple d’architecture de type Harvard Modifié montrant les deux bus
séparés mais une unique mémoire centrale contenant données et instructions.
caches n’est pas souhaitée pour des raisons de complexité de l’architecture. Au contraire,
les microcontrôleurs Intel 8051, ainsi que certains PIC, utilisent un programme enregistré
dans une mémoire disponible à l’exécution en lecture seule (exemple : EEPROM) et les
données sont enregistrées en RAM ce qui justifie l’utilisation d’une architecture de type
Harvard.
Notons également que d’un point de vue fonctionnel, une architecture de type Harvard
Modifié est semblable à une architecture Von Neumann. Par conséquent, il est fréquent
que des processeurs de type Harvard Modifié soient présentés comme étant de type Von
Neumann (exemple : x86 ou ARM9). Parfois, le terme « Modifié » est également omis
lorsqu’il s’agit d’insister sur les bus séparés.
2.1.5 Optimisations
Cette partie présente succinctement (et à titre d’information) les mécanismes les plus
clas-siques qui permettent d’améliorer la vitesse d’exécution des programmes. Ces mécanismes
reposent sur la capacité, dont disposent certaines instructions, à pouvoir s’exécuter en
même temps sans interférence. C’est ce qu’on appelle le parallélisme au niveau des
instruc-tions (Instruction-Level Parallelism, ILP). De multiples stratégies permettent de mettre à
profit cette propriété sur un processeur disposant pourtant d’un seul cœur.
a) Pipeline
L’exécution des instructions d’un programme peut être divisée en plusieurs étapes
succes-sives. En cela, l’exécution d’une instruction est similaire à l’assemblage d’un bien matériel.
Prenons par exemple le cas de l’assemblage de voitures. Supposons que les étapes
néces-saires soient d’installer le moteur (10mn), les portes (8mn) puis les roues (5mn), dans cet
ordre. L’assemblage d’une voiture nécessite donc 23 minutes, soit un peu plus de deux
voitures par heure. Or, si on dispose les voitures sur une ligne d’assemblage, il est possible
d’installer un moteur sur la voiture suivante pendant la fixation des portes sur la première.
Ainsi, dès que la première voiture est assemblée, une nouvelle voiture sort de la chaîne
d’assemblage toutes les 10 minutes soit un débit plus de deux fois supérieur.
Un pipeline est une technique d’implémentation qui permet de traiter plusieurs instructions
en même temps en réutilisant le principe de fonctionnement d’une ligne de production tel
que présenté ci-dessus. Le nombre d’étapes dans un pipeline est un choix d’architecture du
processeur. Le gain en terme de vitesse d’exécution est théoriquement égal au nombre de
niveaux de pipeline. Cependant, un certain nombre de cas empêchent l’utilisation optimale
du pipeline :
•
Le processeur ne permet pas l’exécution simultanée de certains calculs (structural
hazard) ;
•
Une instruction dépend du résultat d’une instruction précédente (data hazard) ;
•
Le programme présente des branchements (control hazard).
Le temps passé par une instruction sur chaque niveau du pipeline correspond généralement
à un cycle processeur. Ce dernier est réglé en fonction de la durée d’exécution du niveau
de pipeline le plus lent. Il est donc important que la durée d’exécution de chaque niveau
soit équilibrée.
b) Prédiction de branchement
Un programme est une suite séquentielle d’instructions. Cependant, il est possible
d’effec-tuer des sauts au cours de l’exécution d’un programme afin de pouvoir effecd’effec-tuer des tests
conditionnels et des boucles. La présence d’un branchement ne permet pas d’utiliser de
manière efficace le pipeline ce qui peut provoquer un ralentissement du programme.
Une solution naïve pour gérer la présence de sauts dans un pipeline serait d’arrêter de
traiter de nouvelles instructions à la détection d’un saut en attendant que la destination
soit connue. Cependant, si le pipeline est long, ceci peut coûter de nombreux cycles
d’hor-loge. Une autre solution est alors de faire un choix quant au branchement et si ce choix
n’est pas le bon, alors les instructions présentes à tort dans le pipeline sont annulées. Cette
approche entraîne un surcoût supplémentaire en cas d’erreur, mais en cas de succès les
performances du pipeline ne sont pas dégradées.
Plusieurs stratégies permettent au processeur d’effectuer une bonne prédiction de
bran-chement. Certaines optimisations peuvent se faire au moment de la compilation, tandis
que d’autres peuvent se faire à l’exécution en tenant compte de l’historique des sauts
précédents.
c) Superscalaire
Certains éléments, tels que des Unité Arithmétiques et Logiques (UAL) par exemple, sont
disponibles en plusieurs exemplaires afin de permettre l’exécution simultanée de plusieurs
instructions sur un même niveau de pipeline. Bien sûr, certains éléments ne sont pas
redondants ce qui peut provoquer dans certains cas des conflits sur les ressources. Dans la
plupart des cas, cela permet cependant d’améliorer les performances.
Certains processeurs superscalaires offrent également la possibilité de faire du
Simulta-neous Multithreading (SMT). Autrement dit, il est possible d’avoir plusieurs fils
d’exécu-tion pour un même processeur. Par exemple, Intel propose la technologie HyperThreading
qui permet d’exécuter deux fils d’exécution par processeur. Les gains annoncés par Intel
sont de l’ordre de 30% mais les résultats dépendent fortement des programmes.
Dans le document
Étude et évaluation des politiques d'ordonnancement temps réel multiprocesseur
(Page 51-54)