Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 1 Introduction aux architectures parallèles Aujourd'hui, la plupart des serveurs sont des machines parallèles (des multiprocesseurs). C'est ainsi qu'un ordinateur peut exécuter des instructions aussi rapidement que la vitesse de la lumière. En réalité, il s'agit d'une structure dite de "pipe-line" qui consiste à décomposer l'exécution d'une instruction en étapes élémentaires traitées en parallèle par plusieurs processeurs. De la sorte, le temps moyen d'exécution d'une instruction est considérablement accéléré. 1 Parallélisme et Architectures Parallèles Il existe plusieurs domaines d'applications pour lesquels l'exploitation du parallélisme est fondamentale : le traitement numérique, les bases de données, le traitement d'images, etc. Pour traiter ces applications, les architectures parallèles peuvent être généralistes (c'est-à-dire capables de répondre aux besoins d'une grande diversité d'applications) ou spécialisées. Les architectures spécialisées sont destinées à exploiter les caractéristiques spécifiques d'une catégorie d'applications ou même d'une seule application. 1.1 Motivations pour le parallélisme 1.1.1 Besoins des applications Le parallélisme peut être exploité pour répondre à la puissance de traitement qui recouvre deux grandes notions : la latence et le débit de traitement. La latence représente le temps nécessaire pour l'exécution d'un traitement. Le débit représente le nombre de traitements exécutables par unité de temps. Réduire la latence est plus difficile qu'augmenter le débit. Dans le premier cas, il s'agit de lutter contre le temps qui, en dernier ressort, est fixé par les possibilités technologiques. Alors que, dans le deuxième cas, si plusieurs traitements sont indépendants, l'augmentation du nombre de ressources suffit pour exécuter plus de traitements en même temps. La puissance de traitement dépend aussi de la capacité et de l'organisation de la mémoire d'un ordinateur. Certaines applications requièrent des ensembles de données dont la taille est supérieure à la capacité d'adressage d'un ordinateur séquentiel. Certaines organisations d'architectures parallèles permettent d’adresser plus de mémoire que des architectures séquentielles. La résistance aux pannes suppose que l'arrêt d'une partie de l'ordinateur (pour panne, maintenance, etc.) n’entraîne pas son arrêt complet. Si l'élément arrêté est le processeur, il est évident 1 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 2 que seul un autre permet de résister à un manque. La redondance repose donc sur la mise en parallèle d'éléments assurant les mêmes fonctionnalités. 1.1.2 Limites des architectures séquentielles Les limites de l'exécution séquentielle découlent des limites des microprocesseurs actuels. Les microprocesseurs possèdent des formats de leurs données et de leurs opérations inadéquates aux caractéristiques de certaines applications. Il peut être préférable, en termes de performance et de coût, de concevoir un ordinateur dont les opérateurs de traitement, l'organisation mémoire, etc. sont adaptés aux calculs à réaliser. L'utilisation simultanée de plusieurs ressources entraîne la nécessité de gérer la coordination de ces ressources et complexifie la programmation. 1.2 Niveaux de parallélisme Le traitement de plus d'une tâche à la fois sur un ordinateur (parallélisme) peut se faire par une exécution concurrente des tâches (simultanéité apparente) ou par une exécution simultanée. La simultanéité réelle ne peut être obtenue que par la multiplication des unités fonctionnelles. Elle implique la duplication de certains éléments de la machine. L'exécution concurrente peut être réalisée soit par la machine elle-même, soit par le logiciel. Le fait que le parallélisme soit réel ou apparent dépend du niveau de la fonction à exécuter dans le système. Il existe plusieurs niveaux auxquels le parallélisme des opérations est possible. 1.2.1 Cheminement des données A ce niveau, le parallélisme est défini par la "largeur" des voies de transfert des données d'une unité fonctionnelle à l'autre à l'intérieur de la machine ; c'est le nombre de bits qu'il est possible de transférer simultanément entre ces unités. 1.2.2 Entre les étapes du traitement des instructions A ce niveau, le parallélisme repose sur l'existence d'au moins deux étapes dans l'exécution d'instructions. Ces deux étapes sont habituellement constituées par une phase "instruction" où l'instruction est amenée de la mémoire à l'unité de traitement, puis décodée, suivie d'une phase d'"exécution" pendant laquelle l'instruction se déroule. Si les circuits logiques participant aux deux phases ne comportent pas la partie commune, partagée, alors la machine est capable d'exécuter une instruction pendant qu'elle prépare la suivante. Il en résulte un certain degré de superposition dans le traitement des instructions. Cette caractéristique est connue sous le nom de "look-ahead". 2 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 3 Potentiellement, cette caractéristique permet de doubler le taux de traitement de la machine. Mais en fait, ce doublement est rarement atteint à cause de goulets d'étranglements apparaissant dans le système : interférence d'accès à la mémoire retardant l'arrivée de l'information requise par l'une des phases, retards dus au traitement des instructions de branchement conditionnel qui empêchent l'arrivée de l'instruction suivante jusqu'au moment où la direction de branchement est connue, ou retards dus à la durée variable d'exécution de certaines instructions en fonction des opérandes (division, par exemple), ce qui immobilise l'unité d'exécution pendant une période plus ou moins longue et retarde donc le démarrage de l'instruction suivante. 1.2.3 Entre les instructions Le parallélisme entre instructions repose sur la multiplication de certaines unités fonctionnelles. Le parallélisme est d'ailleurs souvent limité à la phase d'exécution. Ceci repose sur la technique du "pipe-line" qui est une extension de la technique "look-ahead". La phase d'exécution des instructions est fragmentée en plusieurs étapes intermédiaires. A un instant donné, il y a plusieurs instructions en train d'être exécutées, chacune à une étape différente de son exécution. A un instant donné, on peut avoir par exemple une multiplication virgule flottante, un transfert à mémoire, une addition d'entier s'exécutant simultanément. 1.2.4 Entre régions d'un programme On appellera région une zone de code telle que son exécution peut avoir lieu indépendamment d'autres zones. Par exemple, deux zones constituent des régions si elles ne se passent pas de paramètre et si leur exécution peut être lancée de façon indépendante. Le parallélisme entre régions d'un même programme est obtenu par diverses combinaisons entre machine et logiciel. Pour qu'il y ait simultanéité réelle dans l'exécution des différentes régions, la machine doit être dotée de possibilités de parallélisme au niveau de la phase de décodage/préparation d'instructions multiples. Par contre, la simultanéité apparente entre régions d'un programme peut être obtenue avec un logiciel de multiprogrammation. Les techniques machine/logiciel nécessaires pour une simultanéité réelle ou apparente entre deux régions impliquent l'existence d'un moyen de : reconnaître leur indépendance, démarrer leur exécution "en parallèle", établir les conditions d'une fusion ultérieure des deux chemins parallèles. 1.2.5 Entre tâches formalisées Le parallélisme entre tâches formalisées d'un programme structuré est obtenu par l'intermédiaire du programme de contrôle du système répondant à des directives données par le 3 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 4 programmeur. La différence fondamentale entre parallélisme régional et parallélisme de tâches réside dans la dimension de l'unité à traiter et dans l'utilisation du programme de contrôle dans le deuxième cas. 1.2.6 Entre programmes indépendants Le degré le plus général de parallélisme est obtenu avec la possibilité d'exécuter simultanément des flux de programmes entièrement indépendants. Il est réalisé par couplage de systèmes indépendants en une association formant un système multiprocesseur. Le couplage peut être un partage d'unités de contrôle et/ou d'unités E/S, ou des flux d'E/S des jobs. En dehors des contraintes normales de sérialisation dans l'utilisation des ressources partagées, ces deux arrangements ne requièrent que peu ou pas de coordination entre les différents flux de jobs. 1.3 Définition du parallélisme 1.3.1 Approche intuitive du parallélisme C'est le parallélisme présent dans une application qui permet d'exécuter simultanément, par des ressources matérielles différentes, plusieurs parties de cette application. Le corps de la boucle suivante ne comporte qu'une seule opération. Pour i de 1 à n faire A[ i ] B[ i ] + C [ i ] FinPour A[ 1 ] B[ 1 ] + C [ 1 ] (a) A[ 2 ] B[ 2 ] + C [ 2 ] (b) A[ 3 ] B[ 3 ] + C [ 3 ] (c) Quelque soit l'ordre d'exécution ex : a, b, c ou c, b, a, ou encore b, c, a, etc. les résultats en mémoire sont identiques. La sémantique du programme ne dépend pas de l'ordre d'exécution des itérations de cette boucle. Ces itérations peuvent donc être exécutées en parallèle. 1.3.2 Définition Bernstein a introduit en 1966 un ensemble de conditions permettant d'établir la possibilité d'exécuter plusieurs programmes (processus) en parallèle. Supposons deux programmes : P1 et P2 où chacun utilise des variables en entrée (respectivement E1 et E2) et produit des résultats en sortie (respectivement S1 et S2). Selon Bernstein, les programmes P1 et P2 sont exécutables en parallèle (notation : P1 II P2) si les conditions suivantes sont respectées : {E1 S2 = , E2 S1 = , S2 S1 = } 4 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 5 Plus généralement, un ensemble de programmes P1, P2, ... Pk peuvent être exécutés en parallèle ssi les conditions de Bernstein sont satisfaites c'est à dire si Pi II Pj pour tout couple (i; j) avec i j. L'exemple intuitif et les conditions de Bernstein introduisent la notion de dépendances entre deux ou plusieurs programmes (ou opérations). Pour que deux programmes ou deux opérations puissent être exécutées en parallèle, il faut : 1) qu'ils (elles) soient indépendants (elles), 2) que l'on puisse détecter cette indépendance et 3) qu'il existe suffisamment de ressources pour les exécuter simultanément. 1.4 Les sources du parallélisme 1.4.1 Le parallélisme de données Le parallélisme de données est un type de parallélisme pour lequel la même opération est réalisée simultanément par de nombreux processeurs sur des données différentes. Un exemple simple est celui du calcul matriciel. Pour i de 1 à n Pour j de 1 à n A[i][ j] B[i][j ] +C [i ][j] FinPour FinPour Les itérations de cette boucle sont indépendantes. Il y a n2 itérations avec une opération par itération. Le potentiel de parallélisme exploitable dans cette boucle est donc de n2 opérations simultanées. Son ampleur exploitable dépend directement de la taille des structures de données manipulées. Les données sont de loin la source de parallélisme qui offre le plus de potentiel. Généralement le nombre de processeurs est beaucoup plus petit que le parallélisme potentiel et chaque processeur devra donc traiter plusieurs données. 1.4.2 Le parallélisme de contrôle Le parallélisme de contrôle est un type de parallélisme pour lequel des opérations différentes sont réalisées simultanément. C’est l'absence de dépendances entre différentes parties du programme qui est la source du parallélisme de contrôle. Ceci est un exemple très simple de programme pour un serveur et ci-dessous le programme correspondant pour le traitement client : faire toujours détecter demande-client si demande client vrai lancer traitement-client 5 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 6 finsi finfaire début ouvrir fichier-client faire traitement-demande fermer fichier-client fin Supposons que la fonction « lancer » retourne immédiatement après avoir lancé le programme traitement-client ; c'est-à-dire sans attendre que celui-ci se termine. Dans ce cas, le programme du serveur continue à s'exécuter alors que le programme traitement-client est en cours d'exécution. S’il y a suffisamment de ressources, ces deux programmes seront exécutés simultanément. Il existe une autre forme d'exploitation du parallélisme de contrôle. Elle est appropriée au cas où il existe une dépendance entre les parties du programme qui peuvent être exécutées en parallèle. Imaginons une application vidéo pour laquelle une scène est filmée (opération F) en permanence par une caméra numérique qui fournit un flux d'images numérisées (i0, i1, ...,). On applique à chaque image un filtrage numérique (opération N) qui, à son tour, fournit une image numérisée (j0, j1,...,). Cette image est ensuite compressée (opération C qui fournit l'image k) puis elle est stockée (opération S). L'algorithme de cette application est le suivant : x=0 tant que la scène est filmée faire ix = F() jx = N(ix) kx = C(jx) S(kx) x=x+1 fin faire Les opérations, F, N, C et S, sont toutes limitées par des dépendances de flot. Pourtant ces opérations sont exécutables en parallèle. Il est impossible d'exécuter ces opérations simultanément pour la même image. L'exécution simultanée de ces opérations réside dans le traitement par chacune d'elle d'une image différente. Autrement dit, lorsque F fournit l'image in+3, N traite l'image in+2, C traite l'image jn+1 et S stocke l'image kn. Lorsque ces opérations sont terminées, toutes propagent leur résultat à l'opération suivante et traitent une nouvelle image. Une chaîne est constituée et fonctionne tant que la scène est filmée. Cette forme d'exploitation du parallélisme de contrôle s'appelle le pipeline. Elle repose sur l'organisation des données à traiter sous la forme d'un flux d'informations et sur l'application de plusieurs traitements consécutifs sur chaque élément de ce flux. 6 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 7 1.5 Organisation des architectures parallèles Une architecture parallèle est le résultat d'un équilibre entre plusieurs paramètres : la nature des ressources, les performances relatives de ces ressources, l'agencement des ressources et leur mode de contrôle. 1.5.1 Ressources et organisation schématique des architectures parallèles Les architectures parallèles sont généralement construites à partir des ressources qui composent les architectures séquentielles : unité de traitement, unité de contrôle, mémoire, entrées sorties (disque, réseau, etc.). Durant l'exécution d'un traitement parallèle, toutes les unités échangent des informations. Ces transferts d'informations sont réalisés par une ressource supplémentaire : le réseau de communication interne. Ainsi, les performances des architectures parallèles dépendent des performances de leurs ressources et de leurs agencements. Les microprocesseurs actuels ont des latences pour des opérations entières ou flottantes de 1 à 3 cycles. Avec une fréquence de fonctionnement de 2ns pour les meilleurs, la latence d'exécution de traitement pour une donnée est d'environ 2 à 6ns. Certains processeurs peuvent réaliser deux opérations flottantes et deux opérations entières (sans compter les branchements et les accès mémoire) en un cycle. Avec des données 64 bits, le débit de données peut atteindre 8 opérandes et 4 résultats 64 bits par cycle d'horloge soit : 48 Go/s avec une horloge à 500Mhz. La mémoire statique possède un temps d'accès de quelques ns (typiquement inférieur à 10ns) et un débit égal à l'inverse de cette valeur multiplié par la largeur des mots accédés. Avec des mots de 64 bits et une mémoire à 5ns à 2 ports (i.e à deux accès simultanés), le débit peut atteindre théoriquement 3,2 Go/s. Les meilleurs réseaux actuels ont une latence d'environ 10 s (s : 10-6 seconde) et un débit de 125 Mo/s. Enfin les disques ont des temps d'accès d'environ 10 ms (ms : 10 -3 seconde) et un débit de 10 Mo/s. Les performances des ressources sont donc très différentes. Les modèles d'architectures parallèles sont des équilibres établis à partir des performances relatives de ces ressources. 1.5.2 Classification des architectures parallèles La diversité des ressources et leur nombre important conduit à une grande variété d'agencements possibles de ces ressources dans une architecture parallèle. Pour distinguer des familles d'architectures, on utilise des classifications. 7 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 8 La classification la plus utilisée est connue historiquement sous le nom de classification de ‘Flynn’. Elle classe les architectures suivant les relations entre les unités de traitement et les unités de contrôle. Les unités de traitement calculent chacune un flux de données ou « Data stream ». Les unités de contrôle déroulent chacune un programme (un flux d'instructions ou « Instruction stream »). 1 flux de données Plus de 1 flux de données 1 flux d'instructions SISD SIMD Plus de 1 flux d'instructions MISD (Pipeline) MIMD On distingue quatre types principaux de parallélisme : SISD, SIMD, MISD et MIMD. De nos jours cette classification peut paraître un peu artificielle car le moindre micro-processeur courant inclut lui-même plusieurs formes de micro-parallélisme. Elle permet néanmoins d'expliquer les bases de l'architectures des ordinateurs, séquentiels et parallèles. Cette classification est basée sur les notions de flot de contrôle (deux premières lettres, I voulant dire ‘Instruction’) et flot de données (deux dernières lettres, D voulant dire ‘Data’). 1.5.2.1 Machine SISD Une machine SISD (Single Instruction Single Data) est ce que l'on appelle d'habitude une machine de Von Neuman. Une seule instruction est exécutée et une seule donnée (simple, nonstructurée) est traitée à tout instant. Le code suivant, int A[100]; ... for (i=1;100>i;i++) A[i]=A[i]+A[i+1]; s'exécute sur une machine séquentielle en faisant +A[3], les additions A[1]+A[2], A[2] etc., A[99]+A[100] à la suite les unes des autres. 1.5.2.2 Machine SIMD Une machine SIMD (Single Instruction Multiple Data) peut être de plusieurs types, parallèle ou systolique. En général l'exécution en parallèle de la même instruction se fait en même temps sur des processeurs différents. Examinons par exemple le code suivant écrit en CM-Fortran sur une machine avec 32 processeurs : INTEGER I,A(32,1000) 8 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 9 CMF$ LAYOUT A(:NEWS,:SERIAL) ... FORALL (I=1:32,J=1:1000) $ A(I:I,J:J)=A(I:I,J:J)+A(I:I,(J+1):(J+1)) Chaque processeur i, 1 i 32 a en sa mémoire locale une tranche du tableau A: A(i,1), A(i,2), ..., A(i,1000). Il n'y a pas d'interférence dans le calcul de la boucle entre les différentes tranches : tous les processeurs exécutent la même boucle sur leur propre tranche en même temps. 1.5.2.3 Machine MISD Une machine MISD (Multiple Instruction Single Data) peut exécuter plusieurs instructions en même temps sur la même donnée. Cela peut paraître paradoxal mais cela recouvre un type très ordinaire de micro-parallélisme dans les micro-processeurs modernes : les processeurs vectoriels et les architectures pipelines. 1.5.2.4 Machine MIMD Le cas des machines MIMD (Multiple Instruction Multiple Data) est le plus intuitif. On a deux types d'architecture possibles : (1) Mémoire partagée (2) Mémoire locale avec réseau de communication (Transputer ou par réseau d'interconnexion), ou système réparti Mémoire Partagée: Une machine MIMD à mémoire partagée est principalement constituée de processeurs avec des horloges indépendantes, donc évoluant de façon asynchrone et communiquant en écrivant et lisant des valeurs dans une seule et même mémoire (la mémoire partagée). Le cache de données de chaque 9 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 10 processeur induit une difficulté où ce dernier doit avoir les informations cohérentes aux moments cruciaux. Architecture simplifiée d'une machine à mémoire partagée La synchronisation des exécutions des processus est nécessaire dans certains cas. Si elle n'est pas faite, il y aurait un risque d'incohérence des données. Machine distribuée En général, l'emploi d'autres mécanismes de communication que la mémoire partagée pour une machine MIMD est due au fait que les processeurs sont physiquement éloignés et qu'un partage de petites informations soit raisonnable. Par exemple, le réseau Internet permet de considérer en un certain sens, tous les ordinateurs reliés comme étant un seul et même ordinateur distribué, où les processeurs travaillent de façon asynchrone et où les informations transitent par passage de message. De façon générale, la synchronisation et l'échange d'information peuvent se faire par : Appel de procédure distribuée (RPC) avec réponse synchrone ou asynchrone. Envoi/Réception de message asynchrone (tampon de taille limitée ou non). Envoi/Réception de message synchrone : rendez-vous. Mixtion des deux derniers cas. 1.6 Contrôle d'une machine parallèle Il y a deux méthodes principales : (1) On dispose d'un langage séquentiel : le compilateur parallélise le code objet généré, (2) On a une extension d'un langage séquentiel ou un langage dédié avec des constructions parallèles explicites (Parallel C, Occam...) Pour le deuxième cas, il faut disposer de primitives (ou instructions) pour : 10 La création de parallélisme, Module : Système d’exploitation II Responsable : NINI B. o Itération simultanée sur Chapitre IV : Introduction aux architectures parallèles Page 11 tous les processeurs (FORALL de Fortran parallèle), o Définition d'un ensemble de processus (COBEGIN), o Création de processus (FORK de Unix) Contrôler les tâches parallèles, o Synchronisation (Rendez-vous d'Ada), o Passage de messages (synchrones/asynchrones,...), o Section critiques (gestion de la mémoire partagée), o Arrêt d'une exécution parallèle (COEND, WAIT d'Unix) 2 Lois, modèles et métriques des performances des architectures parallèles 2.1 Performance La performance la plus simple à calculer mais aussi la moins utile est la performance crête. Elle est simplement obtenue par la multiplication de la performance crête individuelle de toutes les unités de traitement par leur nombre dans l'architecture. P = Nb opérations / temps du traitement Par exemple, le nombre d'opérations flottantes pour le produit de matrices carrées est 2n3 si n est la taille du côté de la matrice. Avec un coté de 1000 éléments, il y a donc 2 x 109 calculs à réaliser. Si le temps de traitement est de 1 seconde, le débit de calcul est de 2 x 109 opérations flottantes par seconde ; soit 2 GigaFlops. Le temps d'exécution sert de base à la comparaison d'architectures pour le traitement d'une même application. Avec la formule A = t1/t2, on calcule l'accélération que permet l'architecture 2 (qui à pris le temps t2 pour calculer l'application) par rapport à l'architecture 1 (temps t1). Une des caractéristiques recherchées dans les architectures parallèles est leur extensibilité (possibilité d'augmenter le nombre de processeurs dans l'architecture). Etendre une architecture a un intérêt seulement si cela se traduit par de meilleures performances. Deux paramètres mesurent le gain de performance obtenu par l'augmentation du matériel (plus de processeurs) : l'accélération (speedup) et l'augmentation du débit (scaleup) L'accélération indique le rapport de performance entre deux architectures identiques traitant le même problème mais avec un nombre de processeurs différents. L'accélération est calculée avec la formule précédente. t2 représente alors le temps de l'architecture avec x processeurs et t1 le temps 11 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 12 avec y processeurs. On suppose x >y. L'accélération devrait augmenter linéairement avec le nombre de processeurs. En pratique, c'est rarement le cas. L'augmentation du débit mesure le rapport de la quantité d'information traitée dans le même temps par deux architectures similaires, l'une ayant plus de ressources que la seconde. La formule suivante mesure le scaleup : S = Q2 / Q1. Q2 est la quantité de données traitée par l'architecture 2 et Q1 est la quantité de données traitée par l'architecture 1 dans le même temps. S >1 peut être obtenu en augmentant la performance individuelle des processeurs ou en augmentant le nombre des processeurs. Dans ce cas aussi, l'augmentation du nombre de processeurs devrait accroître proportionnellement le scaleup. En pratique, même si cela est mois difficile que pour le cas du speedup, la présence de communication entre les processeurs et leur coordination réduit le scaleup. 2.2 Lois d'Amdahl et de Gustafson Comme d'autres disciplines, l'architecture des ordinateurs est gouvernée par des lois. Cependant, dans ce domaine de nombreuses lois restent à découvrir pour parvenir à une ingénierie purement calculatoire. Les lois connues découlent directement des propriétés des programmes. La première loi découverte fut la loi D'Amdhal. Cette loi indique la limite de l'accélération atteignable par une architecture parallèle (quelque soit son type) pour un programme particulier. Supposons un programme X. Ce programme est composé d'une partie P exécutable en parallèle et d'une partie S ne pouvant pas être exécutée en parallèle. Soit p le temps d'exécution séquentiel de la partie P et s le temps d'exécution de la partie S. Soit n le nombre de processeurs utilisés pour l'exécution parallèle de P. Alors dans le meilleur des cas l'accélération est égale à : A s p . p s n Selon cette formule, on remarque que quelque soit le nombre de processeurs, l'accélération est toujours bornée inférieurement par s. Si s représente seulement 10% du temps d'exécution totale (s+p), l'accélération sera bornée par (s + p)/s, soit 10. Cela signifie que même avec une infinité de processeurs, l'accélération ne pourra pas dépasser 10. On déduit deux règles de cette loi. Premièrement, lors de l'écriture d'un programme parallèle, il faut limiter autant que possible la partie séquentielle. Deuxièmement, un ordinateur parallèle doit être un excellent ordinateur séquentiel pour traiter le plus rapidement possible la partie séquentielle. 12 Module : Système d’exploitation II Responsable : NINI B. Chapitre IV : Introduction aux architectures parallèles Page 13 La loi d'Amdahl indique que la performance ne dépend pas seulement du nombre de ressources mises en parallèle et de surcroît elle désigne la partie séquentielle comme le facteur limitant. La limite est aussi très sévère car il est très difficile de paralléliser 90 % d'un programme. La loi de Gustavson modère les conclusions de la loi d'Amdahl. Gustavson fait remarquer que la partie parallèle est composée de boucles qui traitent les données. Si la quantité de données à traiter progresse alors la contribution de la partie parallèle dans le temps d'exécution va augmenter (ceci pour un même nombre de processeurs). Par conséquent, la contribution de la partie séquentielle va diminuer. Comme généralement, l'utilisateur du parallélisme utilise plus de processeurs parce qu'il veut traiter plus de données, l'approche de Gustavson est cohérente avec l'utilisation du parallélisme. Plus rigoureusement, soit un programme X avec une partie séquentielle S et une partie parallèle P. Avec n processeurs, le temps de calcul selon la loi d'Amdahl est t = s + P/n. En supposant que la partie parallèle augmente linéairement avec le nombre de processeurs P = a * n, le temps d'exécution avec n processeurs devient : t = s + a. D'où l'accélération : A = (s + an)/(s + a) Et A n ; lorsque a 1. Notons que a représente la taille de la partie parallèle attribuée à chaque processeur. Plus cette taille est importante, plus l'accélération tend vers le nombre de processeurs. Cette taille dépend directement de la quantité d'informations à traiter. Comme les structures de données comportent généralement beaucoup plus d'éléments qu'il n'y a de processeurs dans une machine parallèle (plusieurs millions d'éléments contre moins de mille processeurs), chaque processeur à une quantité importante de données à traiter. L'augmentation de cette quantité provoque généralement une augmentation proportionnelle du temps de traitement pour chaque processeur. La loi de Gustavson correspond donc bien à une réalité. La conclusion de cette loi est que le parallélisme peut dépasser la limite établie par la loi d'Amdahl à condition d'augmenter la quantité d'informations à traiter. 13