Ce videoclip produit par l’Ecole Polytechnique Fédérale de Lausanne fait partie de son cours d’introduction à l’information, à la communication, et au calcul. Il s’inscrit dans le 3e module de ce cours qui porte sur le fonctionnement et la sécurité des systèmes informatiques.
Augmenter la performance ? = Réduire le délai temps d’attente pour obtenir un résultat = Augmenter le débit nombre de résultats dans l’unité de temps Deux exemples simples d’amélioration de la performance : Au niveau du circuit Réduire le délai d’un additionneur Au niveau de la structure du processeur Augmenter le débit d’instructions t t Comme expliqué dans le clip précédent on peut augmenter la performance d’un ordinateur en investissant plus de transistors pour réduire la durée de ses opérations. Une autre façon de gagner en performance est d’investir plus de transistors pour augmenter le débit des opérations …
Parallélisme architectural = Augmenter le débit nombre de résultats dans l’unité de temps En exécutant plusieurs instructions en parallèle t … en en exécutant plusieurs en parallèle – c’est le sujet du présent videoclip.
Notre processeur 103: charge r1, 0 104: charge r2, -21 105: somme r3, r7, r4 106: multiplie r2, r5, r9 107: soustrais r8, r7, r9 108: charge r9, r4 109: somme r3, r2, r1 110: soustrais r5, r3, r4 111: charge r2, r3 112: somme r1, r2, -1 113: somme r8, r1, -1 114: divise r4, r1, r7 115: charge r2, r4 On exécute normalement une instruction à la fois Voyons en quoi cela consiste. Imaginons que nous soumettions le programme ici à gauche à l’unité arithmétique ici à droite. 1 Toutes les instructions du programme sont soumises une à la fois l’une après l’autre à l’UA. 2 Comment pourrait-on accélérer cela? charge r9, r4 soustrais r8, r7, r9 multiplie r2, r5, r9 somme r3, r7, r4 charge r2, -21 charge r1, 0 Unité arithm. Comment faire mieux ?
Doubler le débit de notre processeur 103: charge r1, 0 104: charge r2, -21 105: somme r3, r7, r4 106: multiplie r2, r5, r9 107: soustrais r8, r7, r9 108: charge r9, r4 109: somme r3, r2, r1 110: soustrais r5, r3, r4 111: charge r2, r3 112: somme r1, r2, -1 113: somme r8, r1, -1 114: divise r4, r1, r7 115: charge r2, r4 On pourrait envisager d’exécuter deux instructions à la fois ! Imaginons que nous dotions notre ordinateur non pas d’1 mais de 2 UAs. 1 On pourrait alors imaginer soumettre deux instructions à la fois en parallèle aux 2 UAs. 2 Est-ce réaliste? Est-ce que cela peut poser des problèmes? soustrais r8, r7, r9 charge r9, r4 somme r3, r7, r4 multiplie r2, r5, r9 charge r1, 0 charge r2, -21 Unité arithm. Unité arithm. Problèmes ?!
Doubler le débit de notre processeur 103: charge r1, 0 104: charge r2, -21 105: somme r3, r7, r4 106: multiplie r2, r5, r9 107: soustrais r8, r7, r9 108: charge r9, r4 109: somme r3, r2, r1 110: soustrais r5, r3, r4 111: charge r2, r3 112: somme r1, r2, -1 113: somme r8, r1, -1 114: divise r4, r1, r7 115: charge r2, r4 Le problème est que la 2e instruction a besoin d’une valeur calculée par la 1e instruction! Si on ne fait pas attention, le résultat sera faux ! Eh oui! Voyons ce qui se passerait à l’étape suivante de notre programme. Elle reviendrait à soumettre en parallèle aux deux UAs les instructions somme r3, r2, r1 et soustrais r5, r3, r4 1 On voit tout de suite que dans ce cas la 2e instruction utilise une valeur de r3 qui ne sera disponible qu’après l’exécution de la 1e instruction. Il est donc proscrit de soumettre ces deux instructions en parallèle aux 2 UAs sous peine d’aboutir à des résultats de calculs erronés. somme r3, r2, r1 soustrais r5, r3, r4 Unité arithm. Unité arithm. Problèmes ?!
Doubler le débit de notre processeur 103: charge r1, 0 104: charge r2, -21 105: somme r3, r7, r4 106: multiplie r2, r5, r9 107: soustrais r8, r7, r9 108: charge r9, r4 109: somme r3, r2, r1 110: soustrais r5, r3, r4 111: charge r2, r3 112: somme r1, r2, -1 113: somme r8, r1, -1 114: divise r4, r1, r7 115: charge r2, r4 En pratique on exécute donc entre une et deux instructions à la fois et le résultat est correct ! En pratique les circuits de l’ordinateur peuvent détecter de tels conflits et dans ce cas … n’exécuter qu’une instruction à la fois, laissant la 2e UA inactive pendant ce temps … 1 … après quoi les choses reprennent leur cours parallèle normal … … jusqu’à ce que l’ordinateur rencontre la paire suivante d’instructions à sérialiser. Cette observation vaut aussi toujours quand la 1e instruction d’une paire est un saut inconditionnel. Dans ce cas l’ordinateur est bien forcé de l’exécuter seul et d’ignorer l’instruction qui le suit. 2 En pratique donc, doter l’ordinateur de 2 UA ne garantit pas que le débit d’instructions sera doublé dans tout les cas mais seulement qu’il le sera typiquement une large majorité des cas. somme r8, r1, -1 divise r4, r1, r7 somme r1, r2, -1 RIEN soustrais r5, r3, r4 charge r2, r3 somme r3, r2, r1 RIEN Unité arithm. Unité arithm.
Un processeur “superscalaire” Unité arithm. Banc de registres Détection des dépendances Tous les processeurs modernes pour les ordinateurs portables et les serveurs sont de ce type De plus, ils réordonnent et exécutent les instructions avant de savoir si elles doivent vraiment l’être (p.ex. après une instruction de saut conditionnel) Tous les processeurs modernes pour les ordinateurs portables et les serveurs sont ainsi dotés de plusieurs UA. 1 De plus, ils réordonnent et exécutent les instructions avant de savoir si elles doivent vraiment l’être . En effet quand la 1e instruction d’une paire est un saut conditionnel. Comme l’ordinateur ne peut pas savoir à l’avance si la condition sera vérifiée, il ne peut pas savoir si la prochaine instruction à exécuter est la suivante ou celle donnée par la destination du saut conditionnel. Comme beaucoup de sauts conditionnels sont le fait de boucles et que de telles boucles sont destinées à être répétées de nombreuses fois avant que la condition de sortie de boucle soit vérifiée, l’ordinateur peut faire le pari – dans la vaste majorité de cas – que la condition de sortie de boucle ne sera PAS vérifiée et que la prochaine instruction à exécuter sera donc bien celle qui suit le saut conditionnel. Il peut donc miser là-dessus pour exécuter cette instruction en parallèle au test quitte à devoir abandonner son résultat si le test de sortie de boucle s’avère positif.
Le génie informatique (2) On peut modifier la structure du système pour exécuter les programmes plus rapidement On peut ajouter des ressources aux processeurs pour les rendre beaucoup plus rapides On peut utiliser des processeurs très élémentaires pour les rendre économiques et peu gourmands en énergie On peut donc profondément changer la performance du processeur sans changer sa fonctionnalité. 1 On peut modifier l’architecture du système pour exécuter les programmes plus rapidement au prix d’un plus gros investissement en transistors et en d’énergie pour exécuter plus d’instructions en parallèle, 2 Alternativement on peut réduire une architecture au minimum pour épargner transistors et consommation. 3 Recourir à de tels améliorations relève d’une autre branche du génie informatique qu’on appelle L’ARCHITECTURE des ordinateurs. On vient de voir un exemple d’architecture des ordinateurs, qui est une autre des branches du génie informatique (ou Computer Engineering)