• Aucun résultat trouvé

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.