• Aucun résultat trouvé

Propriétés de correction séquentielle dans un langage parallèle à mémoire partagée

N/A
N/A
Protected

Academic year: 2021

Partager "Propriétés de correction séquentielle dans un langage parallèle à mémoire partagée"

Copied!
105
0
0

Texte intégral

(1)

HAL Id: tel-00005591

https://pastel.archives-ouvertes.fr/tel-00005591

Submitted on 5 Apr 2004

HAL is a multi-disciplinary open access

archive for the deposit and dissemination of

sci-entific research documents, whether they are

pub-lished or not. The documents may come from

teaching and research institutions in France or

abroad, or from public or private research centers.

L’archive ouverte pluridisciplinaire HAL, est

destinée au dépôt et à la diffusion de documents

scientifiques de niveau recherche, publiés ou non,

émanant des établissements d’enseignement et de

recherche français ou étrangers, des laboratoires

publics ou privés.

parallèle à mémoire partagée

Gilbert Caplain

To cite this version:

Gilbert Caplain. Propriétés de correction séquentielle dans un langage parallèle à mémoire partagée.

Réseaux et télécommunications [cs.NI]. Ecole des Ponts ParisTech, 1998. Français. �tel-00005591�

(2)

Docteur de l'Ecole Nationale des Ponts et Chaussées Spécialité Mathématiques-Informatique par Gilbert CAPLAIN

Propriétés de correction séquentielle dans un langage parallèle à mémoire partagée

Soutenue le22 septembre 1998 devant lejurycomposé de:

M. NicolasBOULEAU (Président;Directeur de Thèse) M. René LALEMENT

M. GillesBERNOT (Rapporteur)

M. FrançoisTHOMASSET (Rapporteur) M. FrançoisIRIGOIN

(3)
(4)

LeprésenttravailaétédéveloppéauCERMICSdanslecadred'unprojet commun avec René Lalement et Thierry Salset. Je les remercie tous deux, Renéplusparticulièrement pourlamanièredontilaassuréladirectiondece projet, Thierryplus spécialement pour avoir développé,dans lecadrede sa propre thèse,une application du résultat théorique qui est l'objet principal duprésent travail.

Je remercie Bernard Lapeyre, Directeur du CERMICS, ainsi que René Lalement, dem'avoirconvaincude présenter sousforme d'unethèseun tra-vailqui n'avaittoutd'abord paseu cette destination.

JesuisreconnaissantàNicolasBouleaud'avoiracceptéd'êtreleDirecteur de cette thèse.Ses avis surl'artet lamanière deprésenter une thèse m'ont utilement aiguillonnéau coursde montravail derédaction.

JeremercieGillesBernotetFrançoisThomassetd'avoiracceptéde consa-crerdutemps à l'austèretâche de rapporteuretd'avoir contribué, parleurs avis, à l'amélioration du mémoire. Je remercie également François Irigoin d'avoir bienvoulufaire partie de monjury.

Que soient également remerciés Renaud KerivenetJacques Danielpour ladisponibilitéetlapatiencedont ilsontfaitpreuve lorsquejelesaiassaillis de questions informatiques; ainsi que les secrétaires du centre, Véronique Serre (anciennement), Imane HamadeetSylvie Petit.

Une pensée amicale, enn, pour le CERMICS dans son ensemble, qui procureunenvironnement scientiqued'unegranderichessepar sadiversité et prouve quotidiennement (s'il en était besoin!) qu'excellence scientique etbonne humeurpeuvent allerde pair...

(5)
(6)

1 Introduction 1

2 Le langage étudié 13

2.1 Le langage . . . 13

2.2 Le modèled'exécution . . . 18

2.3 Lacorrection séquentielle. Lanotion d'équivalence sémantique. 25 3 Dépendances et précédences 29 3.1 Le prédicatd'exécutionséquentielle . . . 30

3.2 Dépendances . . . 31

3.3 Précédences . . . 33

3.3.1 Expressiondesprécédences de contrôle . . . 34

3.3.2 Combiner précédences de contrôle etdesynchronisation 35 3.3.3 Lesprécédences desynchronisation . . . 38

4 Quelques résultats préliminaires 43 4.1 Approximations conservatricesdesprédicats . . . 43

4.2 Unlemme surleprédicat d'exécution. . . 44

4.3 Une notionde dated'exécution . . . 45

4.4 L'exécutionmonoprocessusordonnée . . . 49

5 Le théorème d'équivalence sémantique 51 6 Applications du théorème 61 6.1 L'applicationdéveloppée au CERMICS. . . 61

6.2 Quelquesconsidérations decomplexité . . . 62

6.3 L'idée d'exécutionséquentielle test . . . 63

6.4 Letraitementincrémentaldesnon-préservationsdedépendances 69 7 Extensions possibles 75 7.1 Lessynchronisationsà passage deréférences . . . 75

(7)

B Démonstration des lemmes 2 et 3 87

C Communicationà la conférence PARLE 94 91

D Lexique français-anglais 97

(8)

Chapitre 1

Introduction

Lesbesoinsdepuissanceetderapiditédecalculinformatiques'accroissent sanscesse.Lesmachinesparallèles représentent uneréponseà cet accroisse-ment. Le principe général du parallélisme en informatique, consiste à faire exécuterunprogrammesurplusieursprocesseurssimultanément,chaque pro-cesseurprenant enchargeunepartie delatâche (dansunsensà préciser).

Les modèles de programmation parallèle

Il existe plusieurs formes de parallélisme. Nous pouvons les envisager par l'aval, en considérant les formes d'architecture de machines parallèles, ou bienles considérer par l'amont, à travers des modèles de programmation parallèle.Nous inspirant de la classication de Flynn[40 ], nousdistinguons troisformesd'architectureparallèle,correspondant assezétroitement àtrois modèles deprogrammationparallèle. Nousallonsles esquissertoutd'abord, avantd'évoquerensuitequ'ilestparfoispossibleet intéressantde conce-voir un programme dans un certain modèle de programmation, puis de le compiler versune machine cible participant d'un autremodèle.

Le modèledeprogrammation àparallélisme dedonnées.Dansce modèle,des instructions s'exécutant de manière strictement séquentielle accèdent cha-cuneàtoutunensemblededonnéesàlafois,parexempleàtoutuntableau, traitant ces donnéesen parallèle. C'est dansce modèle de programmation queseplacelecalculvectoriel.LelangageFortranHPF[14],parexemple,se réclamedecemodèledeprogrammation. Cemodèleestleplussimple,carle contrôle yreste séquentiel.Cependant,laclassed'algorithmes pour laquelle il est ecace est restreinte. L'architecture de machine correspondante est diteSIMD (Single Instruction stream  Multiple Data stream).

Lesdeuxautresmodèlesdeprogrammationparallèlequenousallonsévoquer maintenantsont les modèlesà parallélismede contrôle:surles architectures

(9)

tanément, sur plusieurs processeurs 1

. Ces formes d'architecture sont dites MIMD(Multiple Instruction stream  MultipleData stream).

Le modèle distribuéà passagede messagescorrespondà l'architecture paral-lèle à mémoire distribuée MIMDDM (MIMDDistributed Memory), dans laquelle plusieurs processeurs dotés chacun d'une mémoire locale, commu-niquentparl'envoietlaréceptiondemessages.Cemodèledeprogrammation parallèleestlepluscomplexeàutiliser,plaçantsurleprogrammeurlacharge delacoordinationetdel'échangededonnéesparl'envoietlaréception expli-citesde messages entre desunités distinctes. Ce modèle de programmation est représenté notamment par les bibliothèques PVM [16 ] et MPI [15 ]. Ce modèle est potentiellement leplus ecace mais la programmation peuts'y révéler dicile pourdes applicationscomplexes.

Le modèle asynchrone à mémoire partagée. Dansl'architecture qui y corres-pond,l'architecture parallèleàmémoirepartagéeMIMDSM(MIMDShared Memory), plusieurs processeurs s'exécutant en parallèle échangent des don-néesavec une mémoire commune. Cettearchitecture estcelle des multipro-cesseurs à mémoire réelle partagée, machines très répandues, dotées d'un petit nombre de processeurs. Le modèle de programmation correspondant occupe, quant à sa diculté de mise en ÷uvre, une position intermédiaire entre les deuxautres modèles précédemment mentionnés. C'est à ce modèle deprogrammation que nousallons nousintéresser dans le présent travail.

Evoquonsdeuxsituationsdanslesquellesdesprogrammessesituantdans uncertainmodèledeprogrammationpeuventêtrecompilésversunemachine cible participant d'unautre modèle.

Nousavonsmentionné le faitqueles multiprocesseurs à mémoire parta-géeétaient dotésd'unpetit nombredeprocesseurs.Cependant,destravaux de recherche récents permettent d'appliquer ecacement le modèle de pro-grammationà mémoire partagée surdesarchitectures distribuéesà passage de messages [24], à travers de nouvelles fonctionnalités qui permettent, en quelque sorte, de compiler un programme parallèle à mémoire partagée en directiond'unréseaudestationsde travail(àmémoire distribuée etpassage de messages, par conséquent), ce qui permetde disposer de ressources plus étendues,sans charges supplémentaires deprogrammation. Il est permis de penserqueceladevraitcontribueràpopulariserlemodèledeprogrammation àmémoire partagée, auquel nousnousintéressonsici.

Nousavonsévoquélelangage Fortran HPF, qui seplacedanslemodèle de programmation à parallélisme de données. Des travaux récents visent à

1.Un processus estl'exécutionséquentielle d'unotd'instructions. Unprocesseur est un élément demachine ayant pour fonction d'exécuter un processus. Les deux notions necoïncidentpasnécessairement:ilpeutparfoisserévélerutilededécrireunélémentde programmecommes'exécutantenplusieursprocessus,dansdescirconstancesoùenréalité,

(10)

développerlacompilation de ce langage versdes architectures partagées ou (surtout)distribuées[6,10].Làencore,lapréoccupationgénéraleestde per-mettrededisposerderessourcesplusétenduessansrendrelaprogrammation pluscomplexe.

Pour plus de détails sur ces modèles de programmation parallèle, on se reportera utilement à[40, 36 ].

Sur les sémantiques du parallélisme

L'utilisationdelaprogrammationparallèleposediérentsproblèmes.Par exemple, apparaît leproblème de l'ecacité de la parallélisation:comment concevoir notre programme parallèle, ou le charger en machine, pour que, exploitantaumieuxlespossibilitésdecettedernière,ilfournissesesrésultats le plus vite possible? Mais, plus fondamentalement, se pose le problème de la correction (au sens de: caractère correct  correctness en anglais) d'un programme parallèle: comment spécier la sémantique souhaitée de ce programme, c'est-à-dire le comportement que l'on en attend quant aux calculseectués etauxrésultatsobtenus?

Lors de l'exécution d'unprogramme séquentiel, sasémantique est assez bien caractérisée conceptuellement, et modélisée sans ambiguïté dans son principe. Les exécutions d'instructions individuelles s'y opèrent suivant un ordre temporel strict chaque instruction termine son exécution avant que l'instructionsuivantecommencelasienne,etdansunenvironnementdonné (c'est-à-direunétatdelamémoire).Parexemple,pourleslangages impéra-tifs séquentiels, la sémantique opérationnelle modélise comment une exécu-tion d'une instruction fait passer l'environnement d'un état à un autre, les transitionsentreétatsétantrégiespardesrèglesformelles([39],parexemple) Le modèle à parallélisme de données a une sémantique analogue,en n decompte,à lasémantiqueséquentielle:comme nousl'avonsmentionné, en eet,lecontrôle yreste séquentiel.

Danslesmodèlesàparallélismedecontrôle,aucontraire,leschoses appa-raissent beaucouppluscompliquées.Dès lors,en eet,queplusieurs proces-sus s'exécutent simultanément, interférant avec desenvironnements de mé-moire éventuellement distincts, leur sémantique est beaucoup moins claire. Par exemple,ilapparaîtunindéterminisme fondamental(tenant aufaitque les processussont autorisés, apriori, à s'exécuter à desvitesses diérentes) quin'existe pasaumême titre danslecasd'unprogramme séquentiel.

Lamodélisationducomportement deprogrammesàparallélismede con-trôleafaitl'objetdeplusieurstravaux.En1978,Hoareaintroduitlemodèle des processus séquentiels communicants (Communicating Sequential Pro-cesses, ou CSP)[23 ], danslequel les processus communiquent par envoiet réception de messages CSPest donc plus particulièrement adapté au

(11)

mo-sens qu'un message ne peut être émis que si son destinataire est prêt à le recevoir (rendez-vous), par opposition au cas asynchrone où le processus émetteur n'apasbesoin d'attendre(en suspendant sonexécution) la récep-tionde sonmessage lemodèle quenousallonsconsidérer comporteuntel mode asynchrone de communication entre processus. En 1980, Milner dé-veloppa un calcul algébrique permettant de décrire de manière abstraite le parallélismeetlenon-déterminisme(CalculusforCommunicatingSystems, ou CCS), développement qui déboucha ensuite sur le -calcul (1989) ([29 ], par exemple). Ona dit que le-calcul est auxlangages parallèles ce que le -calcul estauxlangagesfonctionnels.

Pour de plus amples développements sur ces questions, on se reportera utilement à [2].

Evoquonsbrièvement diérentespropriétés decorrectionsémantiquequi ont été envisagées, dans diérents contextes, avant de mentionner celle à laquellenousallons nousintéresser. Ces propriétés concernent le modèlede parallélismeparentrelacementd'actions(interleavingsemantics).Nousnous plaçons ici plutôt dans le modèle de programmation à mémoire partagée  dans lequel, par conséquent, des processeurs accèdent en parallèle à des mémoires  mais ce qui va être dit peut être transposé à un modèle de mémoire distribuée.

La sérialisabilité

La sérialisabilité (serializability) est une condition qui a été étudiée à propos des systèmes de bases de données [34 ]. On considère une base de données susceptible d'être interrogée et modiée par plusieurs utilisateurs, ici assimilés à plusieurs processus, dans notre sens, accédant à cette base comme à une mémoire partagée. Chaque utilisation se décrit comme une transaction, composée d'une lecture de certaines données de la base, suivie d'une écriture (c'est-à-dire d'une modication) de certaines données de la base.Onpeutenvisagerunaccèsséquentielàlabasedanslequelles transac-tions sesuccéderaient strictement, en ce sens quela lecture composant une transactionseraitimmédiatementsuiviedel'écriturecomposantcettemême transaction,sansintercalationd'uneopérationd'uneautretransactionentre les deux

2

. La sérialisabilité, c'est la prescription que le résultat de l'appli-cation d'un ensemble quelconque de transactions en parallèle, soit le même que si ces transactions avaient été appliquées selon un tel accès séquentiel (dans un ordre non imposé). Prenons un petit exemple: soient deux tran-sactionsvisantchacuneàincrémenterunmêmecompteurd'uneunité.Siles

2.Dansunetelleexécution,lestransactionsseraientatomiques:l'atomicité (étymolo-giquement:indivisibilité)d'uneexécutiond'uneinstruction,c'estlaspécicationqueles opérationsélémentairesdontsecomposecetteexécutions'accomplissentcommeuntout,

(12)

deuxtransactions sesuccèdent dans letemps, sansentrelacement, le comp-teur se trouvera incrémenté de 2 (comportement souhaité dans l'exemple). Sienrevanchelesdeuxtransactionssont entrelacées,lesecondutilisateurlit le compteur avant que le premier l'ait incrémenté, etl'incrément nal sera seulement de 1 (comportement indésirable dans l'exemple). La sérialisabi-lité exige, sur cet exemple, que les deux transactions ne puissent pas être entrelacées. Dans d'autres cas, en revanche, certains entrelacements seront autorisés. La satisfaction de cette condition de sérialisabilité pourra requé-rir, par exemple, dans la programmation des transactions, le recours à des sections critiques(chap.7).

La consistance séquentielle et la linéarisabilité

Laconsistanceséquentielle(sequentialconsistency)d'unmultiprocesseur, notiondéveloppée dans[27],estlaprescription quelerésultatde toute exé-cution d'un programme soit le même que si toutes les opérations exécutées par les diérentsprocesseurs l'étaient dansuncertain ordreséquentiel(non imposé) compatible avec l'ordre d'exécution des opérations de chaque pro-cesseur.

La linéarisabilité (linearizability), notion développée dans [20], est une prescription plus exigeante que la consistance séquentielle, en ce sens que chaqueopérationexécutée surchaqueprocesseur sevoit attribuer un inter-valle de temps; à l'exigence de consistance séquentielle, on ajoute alors la prescriptionque,dansl'ordreséquentieléquivalent,l'instantd'exécutionde chaqueopération, supposéponctuel, soit contenu dansl'intervalle detemps associé.

Illustronsces deuxpropriétés à travers unpetitexemple concernant des lectures et des écritures eectuées par deux processeurs P1 et P2 sur deux variables a et b. L(a,1) (resp. E(b,0)) signie: lecture de la valeur 1 sur a (resp:écriture de la valeur 0 sur b). Soit une observation des opérations suivantes surles deuxprocesseurs:

P1 : E(a,0) ; E(b,1) ; L(a,1) P2 : E(b,0) ; L(b,1) ; E(a,1)

Cette observation est compatible avec la consistance séquentielle, en ce sens qu'il existe (au moins) une exécution séquentielle de ces 6 opérations, compatible avec lasémantiquedeslecturesetécritures,etrespectant l'ordre desopérations de chaque processeur; par exemple (enconservant trace des processeurs d'origine):

(13)

Si, enrevanche, une observation plus complètede cesmêmes opérations fournit des intervalles de temps [t1,t2] d'exécution de chaque opération, delamanière suivante:

P1 : E(a,0,[0,1]) ; E(b,1,[4,5]) ; L(a,1,[6,7]) P2 : E(b,0,[0,1]) ; L(b,1,[2,3]) ; E(a,1,[4,5])

cetteobservationainsicomplétéen'estpascompatible avec lalinéarisabilité, car la lecture L(b,1,[2,3]) y est contrainte (par l'intervalle de temps) à seproduire avant l'écriture E(b,1,[4,5]), et devrait être une lecture de la valeur 0,non de1.

Consistance séquentielle et linéarisabilité peuvent s'interpréter comme despropriétés quel'onpeutrequérird'unmécanismedegestiondemémoire surune machine parallèle à mémoire partagée. Par exemple, la consistance séquentielleestassuréedèslorsquelesappelsàlamémoire(enlectureouen écriture),émisparchaqueprocesseurdanssonordred'exécution,sontservis dansl'ordre de leur arrivée à lamémoire [27 ]. Onpeutenvisager, dansune démarche expérimentale, de tester la consistance séquentielle, ou la linéa-risabilité, du système de mémoire d'un multiprocesseur, sur une exécution donnée d'un programme parallèle. La complexité de ce test a été étudiée par [17 ]:leproblème général est NP-complet. Un résultat analogue de NP-complétudea étéétablipour letest général de lasérialisabilité[34 ].

La correction séquentielle

La propriétéde correction séquentiellequenousallonsenvisager esttrès diérente des propriétés que nous venons d'évoquer. Dans ces précédentes propriétés, il était demandé qu'une exécution parallèle d'un certain pro-grammesoitanalogue,dansseseets, àune certaineexécution séquentielle, non spéciée a priori, de ce même programme. La propriété que nous al-lons considérer est plus exigeante, au sens suivant: dans le cadre où nous noussituons, un programme parallèle est considéré commele résultat de la parallélisation d'unprogramme séquentiel donné, etnoussouhaitons que le résultat detoute exécution de ce programme parallèle soit identiqueà celui du programme séquentiel considéré, et non pas identique seulement à celui d'unecertaineexécution séquentiellepossible.Nousyreviendronsdansun instant.

Ce point de vue que nousadoptons ici est particulièrement adapté aux applicationsdu parallélismedansledomaine ducalcul scientique.

Contexte de la recherche

AuCERMICS,nousnoussommesintéressésaumodèledeparallélismeà mémoire partagée. Dans unpremier temps, notre attention s'estportée sur

(14)

Un groupe de constructeurs de super-calculateurs a créé en 1989 le Pa-rallel Computing Forum (PCF) dans le but de standardiser la syntaxe et lasémantiquedes extensionsparallèles de Fortran présentes dansleurs sys-tèmes. Un comité de normalisation ANSI, dénommé X3H5, est issu de ce forum. Il s'est xé pour objectif d'établir un modèle sémantique de pro-grammationparallèle[33] indépendantdetoutlangageet del'appliqueràla dénitiond'extensions de langagesimpératifs.

Dans cette mouvance, nousavonsétudié un langage quenousavons ap-pelé Fortran X3H5, obtenu en ajoutant à Fortran77 un certain nombre de constructionsparallèles X3H5

3 .

Ces dernières années,lecomité X3H5sembleêtre tombé quelque peu en sommeil, l'intérêt ayant semblé se porter plutôt vers le modèle de parallé-lisme à mémoire distribuée. Cependant, il semblerait qu'un regain d'intérêt se manifeste, tout dernièrement, en faveur du modèle de programmation à mémoirepartagée,quinousintéresseici.Commesignesdecepossibleregain, onpeutmentionner lapropositiondestandardOpenMP[32 ],destravauxde recherche en cours [37],ouencore les travauxquenousavonsdéjà mention-néssurlacompilationdeprogrammesparallèlesàmémoirepartagéeversdes machines distribuées [24 ].

Dans le domaine de la programmation parallèle, une tendance impor-tante a consisté à fournir des paralléliseurs, logiciels parallélisant automa-tiquement des programmes séquentiels. Toutefois, des concepteurs de pro-grammes peuvent être conduits à paralléliser eux-mêmes directement les programmesqu'ilsconçoivent.Lesdeuxapprochesprésentent desavantages etdesinconvénients.

Le recours à la parallélisation automatique présente l'avantage de per-mettreàl'utilisateur deprogrammer enséquentiel,selon unedémarche fa-milière,etdansunlangageséquentielbienconnudelui,parexempleFortran. Cettedémarcheprésenteaussidesinconvénients:enraisondel'automatisme, lesparalléliseursnepeuvent transformerchaque programmeecacement;la parallélisation reste assezcoûteuse etde complexité dicile àconnaître;on y utilise souvent des outils génériques devant expérimenter des méthodes variées, dans une démarche non ciblée, au détriment de la vitesse de cette parallélisation.

La programmation directement parallèle, en revanche, peutpermettre aux concepteurs d'obtenir une meilleure performance et(ou) une meilleure compréhension de la parallélisation qu'ils obtiennent. Elle fournit plus de souplesse quelaparallélisation automatique.

Le sentiment qui semble prévaloir, c'estque les deuxapproches devront coexister. L'utilisation de langages explicitement parallèles devrait se

dé-3.Cetravail,danssespremièresphases,aétéeectuédanslecadred'uncontratMRT (contratn

o

(15)

velopper. Pour des discussions sur ce sujet, on se reportera à [40, 9], par exemple. Les travaux sur la parallélisation automatique sont nombreux: mentionnons par exemple ici [10, 9 , 6, 18]. Nous allons nous placer dans laperspectivedel'utilisationde langagesexplicitement parallèles.Toutefois, certainesnotionsquenousdévelopponsiciseraientéventuellementutilisables dansledéveloppement de paralléliseurs automatiques.

Danslecadredel'utilisationdelangagesexplicitementparallèles, ilpeut être utile de fournir un outil de vérication de laparallélisation ainsi réali-sée plus précisément, de vérication de lapropriété de correction séquen-tielle que nous avons précédemment introduite. L'objectif de notre travail, auCERMICS,était d'étudier lafaisabilité d'untel outil.

Nous nous sommes donc intéressés à cette propriété de correction sé-quentielle, pour desprogrammes écrits dansun langage parallèle adaptéau modèleàmémoirepartagée auquelnousnousintéressonsici.Cettepropriété peutsedécrire commeune équivalence sémantiqueentreun programme pa-rallèle, et la version séquentielle de ce programme, que nous dénissons. Nous souhaitons que le programme parallèle eectue les mêmes calculs, et produise donc les mêmes résultats, que sa version séquentielle, simplement plus viteque cette dernière. C'est cette propriété d'équivalence sémantique qu'ils'agirait depouvoir vérier.

Vérier la correction séquentielle

L'objetprincipal du présent travail estde présenter et de démontrer un théorème qui énonce des conditions susantes pour cette propriété d'équi-valencesémantique.Cethéorèmes'appliqueàunlangageparallèlebeaucoup plus général quele Fortran X3H5 auquel nous noussommes intéressés tout d'abord.Ce théorèmeafait l'objetd'une application,dansun outilde véri-cation de programmes parallèles écrits en Fortran X3H5, dans lathèse de ThierrySalset[36].

Certaines notions de base que nous utilisons ont été introduites dans [3].Dans le développement des programmes parallèles à mémoire partagée, la diculté est d'éviter les conits mémoire. Il y a conit mémoire dans uneexécutionparallèle,lorsquedeuxinstructionss'exécutantsimultanément accèdent à la même case mémoire (à la même variable), l'une au moins écrivant surcette variable (conditions deBernstein, 1966)(lorsqueles deux accès sont en lecture, leur concomitance ne crée pas de perturbation: on ne ditpasqu'il ya conit dans ce cas).Lesrisquesde conit mémoire sont associésàdesdépendancesdedonnées.Unedépendancededonnéesreliedeux accèsàlamêmevariablelorsquel'unaumoinsdecesaccèsest uneécriture. An des'assurer quele programme parallélisé fournit lemême résultat que

(16)

préservée, c'est-à-dire que les deux accès correspondants s'eectuent à des instants distincts, et dans le bon ordre (une exigence que l'on traduit par l'expression:dépendance implique précédence).

Considérons par exemple l'élément de programme ci-dessous. Dans cet élément de programme, nous supposons que le tableau A() ne gure que commeindiqué. Dans le langage quenous allonsdénir, ceciest une boucle parallèle: l'instruction pdo (pour parallel do) signie que les N itérations de cette boucle peuvent être exécutées en parallèle. Noussupposons ici que lenombre N d'itérations est supérieurou égal à 4 et nous nousintéressons par exemple à l'emplacement mémoire A(4). Cet emplacement est lu par l'instructionbàl'itérationI =4;maisquellevaleurcontient-ilàcemoment?

pdo I=1,N ... b: ...=A(I) a: A(I+3)=... ... endpdo

Si cette boucle était exécutée séquentiellement (si c'était un do au lieu d'unpdo), cettevaleurserait, dansl'exemple,cellecalculéepar l'instruction a à l'itération I =1. Mais,commela présente construction permet l'exécu-tiondesitérations enparallèle, rienn'assure quel'instructiona àl'itération 1 s'exécute avant l'instruction b à l'itération 4. Elle peut s'exécuter après, auquel cas la valeur A(4) lue en b sera la valeur qui se trouvait dans cet emplacement mémoireavantlaboucle.Lesdeuxinstructionspeuventmême s'exécuter en même temps,en ce sens que les opérations élémentaires com-posant ces instructions risquent d'être exécutées de manière entrelacée, ce quidonnerait unrésultat indéterminé.

Dans le cadreoù nous nousplaçons, nous voulons éviter de tels conits mémoire.Dansl'exemple,pour redonneràcetélément de programmele dé-terminisme souhaité, nous ajouteronsdes synchronisations:lesinstructions post et wait dans cet exemple (gure 1.1), dans lesquelles gure une ré-férence à une variable de type événement, ici E(). La sémantique de ces synchronisations est la suivante: le wait ne peut être franchi que si un postseréférant au même événement a étéexécutéauparavant.Dans notre exemple, donc, le contenu de la case A(4) sera lu par b à l'itération I = 4 aprèsfranchissementduwaitwàcettemêmeitération,doncaprèsexécution dupostpàl'itération I =1(synchronisation associéeà l'événement E(4)), donc aprèsle calcul deA(4) par a àl'itération I =1.

Dans l'exemple, le recoursà une boucle parallèle avec synchronisations, plutôtqu'àuneboucleséquentielle,estintéressantsurtoutlorsquel'exécution

(17)

do I=1,3 do I=1,3

... ...

post E(I) continue

enddo enddo

pdo I=1,N do I=1,N

c: ... ...

w: wait E(I) continue

b: ...=A(I) ...=A(I)

a: A(I+3)=... A(I+3)=...

p: post E(I+3) continue

d: ... ...

endpdo enddo

Fig. 1.1:Une boucle parallèle et sa version séquentielle

La version séquentielled'unprogramme parallèle sera leprogramme sé-quentielobtenuenreséquentialisant ceprogrammeparallèle,c'est-à-direen remplaçantlesbouclesparallèlespar desbouclesséquentielles,etenretirant les instructions de synchronisation (ici remplacées par des continue: des instructionsqui ne font rien).

Le théorème présenté ici établit que l'équivalence sémantique entre un programme parallèle et sa version séquentielle est assurée dès lors qu'un ensemble de conditions que nous spécions sont satisfaites. Le point im-portant, c'est que ces conditions portent surla version séquentielle au sens suivant:supposantlapréservationdesdépendancesàtraverslesrelationsde précédence telles que dénies selon la sémantique séquentielle, et quelques autres hypothèsesconcernant laversionséquentielle également,nous dédui-sons l'équivalence sémantiquepour toute exécution possible du programme parallèle.L'exigencedeseréféreràlaversionséquentiellel'impossibilitéde sefondersuruneexécutionparallèle particulièreexpliqueengrandepartie certainessubtilités de ladémonstration.

Cetteexigenceestmotivéeparlaconsidérationsuivante:aussilongtemps quelacorrection(dansnotresens)duprogrammeparallèlen'apasétévériée parunmoyenquelconque,nousn'avonsaucunegarantiequedeuxexécutions diérentes de notre programme fourniront les mêmes résultats. Par consé-quent,l'éventuellevéricationexpérimentale qu'uneexécutionparallèleest correcte, outre son coût (par hypothèse, les programmes que l'on se préoc-cupe de paralléliser sont généralement coûteux en temps d'exécution!), ne garantirait rien en ce qui concerne une autreexécution ultérieure du même programme: ily aun indéterminisme inhérent àlaparallélisation quenous considérons ici. Il nous est donc interdit de nous reposer sur une démarche

(18)

D'où l'idée, dans un premier temps, de tenter une vérication statique, utilisant uniquement le texte du programme. Par ailleurs, ce caractère sta-tiquevanousautoriseràconsidérerdesprogrammesparamétrés,c'est-à-dire des classes de programmes diérant les uns des autres par les valeurs de paramètres. Par exemple,dans de nombreusesapplications, uncertain pro-gramme parallèle sera destiné à être exécuté un grand nombre de fois, sur desdonnéesdiérentes:cesdonnéesserontdesparamètres dansnotresens. A ce sujet, dans un deuxième temps, il sera parfois possible de vérier statiquement que lacorrection d'un certainprogramme parallèle ne dépend pasdes valeurs des paramètres.Dansdetellessituations, quiseprésenteront assez souvent en pratique, il sera envisageable de vérier cette correction à traversl'observationd'uneexécutionséquentielleparticulièreduprogramme, sur un jeu de valeurs particulières des paramètres, en bénéciant, pour ce faire, de la référence de notre théorème à la seule sémantique séquentielle. Ainsi, lorsque cette vérication dynamique sera concluante, le programme parallèle sera-t-il validé pour des utilisations futures sur des données dié-rentes.

La référence à la version séquentielle dans notre théorème a une consé-quence intéressante, concernant l'utilisation qui peutêtre faite de l'analyse de ot de données (dataow analysis) dans notre démarche. L'analyse de ot de donnéesestl'étude de ceque l'onpeutinférer,à lacompilation d'un programme séquentiel, sur la circulation des données qui s'opérera lors de l'exécution de ce programme. Cette étude vise par exemple à réaliser des compilateurs optimisants. Lestravaux sur l'analyse de ot de données sont nombreux:mentionnons parexemple [30, 42 ,31 ,1,13 , 7,11 ].

Adaptée à l'étude du ot de données dans un programme séquentiel, l'analysedeotdedonnéesnesetransposedoncpasd'embléeàuncontexte parallèle,notamment parcequ'ellefaitusagede l'ordretemporelstrictdans lequel s'exécute un programme séquentiel, ordre qui, par hypothèse, n'est paspréservé dansune exécutionparallèle. (Ilfaut cependant mentionner ici que des travaux récents, par exemple [12], développent des analysesde ot de donnéessurdes programmesconcurrents.)

En revanche, dans la mesure où notre théorème permet de ramener la propriétéde correctionséquentielle d'unprogramme parallèle àdes proprié-tésà vérier surlaversion séquentiellede ce programme,c'est-à-dire en n de compte à despropriétés d'unprogramme séquentiel, l'analyse de ot de donnéespeutserévélerutilepourlavéricationdecespropriétéssurletexte deceprogrammeséquentiel.C'estainsiquelaréférencedenotrethéorèmeà laseule sémantiqueséquentielle, nécessaire pour que nosconclusions ne re-posentpassurunehypothèseliéeàuneexécutionparallèleparticulière,nous apporteiciunautreavantage:nouspermettred'utilisertouteslesressources del'analyse deot dedonnéesen vuedetenterde vérierleshypothèsesde

(19)

Plan

Danslechapitre 2,nousprésentonslasyntaxedu langageque nous étu-dions, et nous décrivons les aspects de son modèle d'exécution qui nous intéresseront.Puisnousdévelopponslanotiondecorrectionséquentielle,qui sedécritcommeune équivalence sémantique.

Lechapitre3estconsacréàladénitionformelledesprédicatsde dépen-danceetdeprécédence.

Dans le chapitre 4, nous donnons quelques résultats préliminaires; no-tamment,nousintroduisonsunenotion de date d'exécution.

Le chapitre 5est consacréà ladémonstrationde notre théorème d'équi-valence sémantique(théorème 1).

Le chapitre 6 esquisse des considérations sur l'application de ce théo-rème 1.Notamment, nous yabordons l'étude de situationsoù l'équivalence sémantique d'unprogramme ne dépend pasdes paramètres le théorème 2 donne un critère simple de vérication de cette propriété. Nous esquissons l'étude de la vérication dynamique de correction dans une telle situation (Ÿ6.3). Puisnous étudionsune propriété assez intéressantede notre équiva-lencesémantique:uncertaincaractèreincrémentaldelavéricationdecette propriété.

Danslechapitre7,nousesquissonsuneextensiondenosrésultatsdes cha-pitresprécédents, en abordant les sections critiques, une structure parallèle quinous conduira àélargir, c'est-à-direaaiblir, notre notion d'équivalence sémantique.

(20)

Chapitre 2

Le langage étudié

2.1 Le langage

Lelangagequenousconsidéronsestuneextensiond'unlangageséquentiel impératif assezgénéralparl'adjonction dequelquesconstructionsparallèles. Encequiconcernelesaspectsséquentiels,nousavonslesaectations;des variablesde typesnumériques(entiers, réels...), de type logique(booléens); les opérations arithmétiques ou logiquesusuelles associéesrespectivement à cestypes;desréférences scalaires etvectorielles (tableaux  lesexpressions d'indices d'un tableau seront de type entier). Notre langage peut compor-ter d'autres typeset structures de variables très divers, ainsi que des poin-teurs (comme en C++, par exemple), maisnos résultats, toujours valables, peuvent alors éventuellement serévélermalaisément applicables,voire inex-ploitables. L'utilisation de pointeurs, notamment, présentera ce risque. La préoccupation que nous garderons présente à l'esprit ici, sera que les réfé-rences d'entrée/sortie dansune instructionsoient relativement claires.

Notre langage comporte lesinstructions structuréessuivantes:

 Lesboucles statiques, notées:

DO <indice>=<borne_inf>,<borne_sup> <liste_instructions>

ENDDO

Les bornes de boucles, expressions entières, sont évaluées à l'entrée danslaboucle, etne sont pasréévaluées àchaque itération.(C'est en cesensquenousparlonsicidebouclesstatiques).L'indiced'itérationne peutpasêtre modiépar écriture danslaboucle. Pour lacommodité, nos boucles sont normalisées, c'est-à-dire que l'incrément de l'indice

(21)

 Les branchements conditionnels, notés:

IF <test> THEN <liste_instructions> ELSE <liste_instructions> ENDIF

 Les boucles dynamiques,notées:

WHILE <test> <liste_instructions> ENDWHILE

Ces instructions structuréespeuventêtre emboîtées.

Nous excluons les goto. C'est un fait bien connu que tout algorithme séquentielpeutêtreexprimé sans avoir recoursàdesgoto:cette exclusion neconstituedoncpasunelimitationici;toutalgorithmeséquentielpeutêtre exprimé dansnotrelangage.

Notre langage comporte des appels à des sous-programmes, avec toute-fois troisrestrictions importantes: tout appelà un sous-programme doit se terminer;les sortiesdoivent êtrefonctionseulement desentrées (détermina-tion);leséchangesde valeursdoivent survenirseulement àl'appel(pourles entrées)etauretour (pourlessorties)en d'autrestermes,l'appelau sous-programmedoitêtreassimilableàune instructionsimpleence quiconcerne leséchanges devaleurs(nousreviendrons surce point).

Notre langagecomporteles constructionsparallèles suivantes:

 Lesbouclesstatiquesparallèles,notéespdo,spécientquelesitérations peuvents'exécuterenparallèle.Pourlereste,ellesobéissentàlamême syntaxe quelesboucles do.

PDO <indice>=<borne_inf>,<borne_sup> <liste_instructions>

ENDPDO

 Les sectionsparallèles, notées:

PSECTIONS SECTION <liste_instructions> SECTION <liste_instructions> ...

(22)

 Dessynchronisationsexplicites:nousconsidéronsdessynchronisations par variables événements, à travers despairespost/wait.

CLEAR <evenement> POST <evenement> WAIT <evenement>

Cestroisinstructions clear, postetwait sontles seulesà avoir ac-cèsauxvariablesdetype événement,lesdeuxpremièresenécriture,la dernière en lecture. Un post (resp. un clear) donne à l'événement auquel il fait référence la valeur posted (resp. la valeur cleared). Les variables événements sont initialisées à cleared. Un wait a un com-portement particulier:ilévaluel'événement auquelil faitréférence;si cetévénement estcleared, lewaitattend etrecommence plustard;si cetévénementestposted,lewaitestalorsfranchi(alorsseulement,on ditqu'ilestexécuté),etl'exécutionpasseàl'instructionsuivante.C'est ainsiqu'unwaitestconduitàattendrequ'unpostaitposté l'évéve-mentcorrespondant,commenouslesouhaitions.Notonsqueleclear, enréinitialisant lesévénements, permetlaréutilisationultérieuredes mêmesvariablesévénements pour dessynchronisations diérentes.

Nous apporterons plus loin (Ÿ2.2) des compléments nécessaires sur le comportement dessynchronisations.

Dansnotrelangage,nousintroduisonsdesparamètres,souslaformede variables destinées à recevoir une valeur au démarrage du programme et non modiées par desécritures dansle courant du programme. Ainsi, dans notreétude, un programme représenteenfait une classedeprogrammes qui dièrent les uns des autres par les valeurs des paramètres. (Par exemple, dans de nombreuses applications, des dimensions de matrices seront des paramètres en ce sens. De manière diérente, en présence de programmes s'exécutantsurdesdonnéesexternes,cesdernièresseront iciassimiléesàdes paramètres.)

Une instance de programmeestobtenueàpartir d'unprogramme en attribuant desvaleursconstantesauxparamètres.

Dans ce qui suit, les paramètres, et les indices de boucle à l'intérieur de leurboucle,ne seront pasdésignéscomme desvariables. Une variable est un emplacement mémoire autre qu'un emplacement assigné à un indice de boucle ou à un paramètre. Une référence est un élément syntaxique désignant unevariable. Par exemple,dansl'aectation:

(23)

oùB n'estpasuntableaudeparamètres,A etB(I)sontdesréférences;si Iestunindicedeboucleetquecetteinstructionsetrouveêtreexécutéepour I =3,alors,danscette exécution del'instruction, laréférence B(I) pointe vers la variable B(3). Nous dirons que cette exécution de cette instruction fait référence à cette variable B(3), en entrée en l'occurrence (et à A en sortie).

Références dynamiques; ordre d'indirection

Les variables sont autorisées dans les bornes de boucles do et pdo, les expressions de test dans les if et (évidemment) dans les while, dans les expressionsd'indicesdetableaux(référencedynamique devariables).Notons queles variables événementsgurant danslessynchronisationspeuventêtre destableaux, objetspossiblesderéférence dynamique.

Cette propriété de référence dynamiquenous amène à introduire la no-tion d'ordre d'indirection. Une référence est d'ordre d'indirection 0 s'il s'agitd'unscalaireoud'untableaudont lalisted'expressionsenindice com-porte seulement des constantes, des indices de boucles englobantes et des paramètres

1

. Une référence est d'ordre d'indirection n > 0 s'il s'agit d'un tableau dont laliste d'expressionsen indice contient desréférences d'ordres d'indirection n 1 (pour l'une au moinsd'entre elles) ou moins. (Dans les programmesusuellement rencontrés,l'ordred'indirectionestrarement supé-rieurà 2 .)

Donnonsquelquesexemples. I désignantunindicedeboucleenglobante, P unparamètre,A(;) etB()destableauxdevariables,fonc()une fonction,

A(I+3,fonc(P))est une référenced'ordre 0;

A(B(2),P+B(I)) estd'ordre 1(ses deux expressions en indice étant d'ordre 0);

A(B(A(3,I)),fonc(B(2))) est d'ordre 2, ses deux expressions en indice étant d'ordres1 et 0respectivement.

La notion d'instance d'instruction

Pour la commodité, dans ce qui suit, les instructions que nous allons considérer seront seulement des instructions simples, non des instructions structurées,saufmentioncontraire; par ailleurs,nousconsidérerons comme instructionsnonseulementlesinstructionsexécutablesausenshabituel,mais

1.Noussupposonsicique,dansnotrelangage,lesseulstypesdevariablesdanslesquels uneréférence peutelle-mêmecomporter desvariables,sont les tableaux.Unscalaire est alorsunevariablequin'estpasd'untypetableau. Ilseraitaisé d'étendrecettenotionde référence dynamique à d'autres types dans lesquels des références peuvent elles-mêmes

(24)

aussi:lestêtesetns dedo,if, whileetdeconstructions parallèles;et les expressions detestsdans leswhile.

La prise en considération de boucles do, pdo et while nous conduit à dénir une notion d'instance d'instruction. Dans une première idée, une instruction d'une boucle pouvant s'exécuter plusieurs fois, chacune de ces exécutions serait dénie comme une instance de cette instruction. Par exemple,dans une boucle simple s'exécutant 10 fois,chaqueinstruction gé-nérerait 10 instances. C'est la dénition classique (voir par exemple [40]). Cette dénition classique présente une diculté pour nous: notre langage autorisant des variables dans les bornes de boucles statiques, ainsi que les boucles dynamiques(while),l'ensembledesinstancesgénéréesparune ins-truction ne serait pas toujours connu statiquement. Il nous est donc utile d'introduireune autre dénition.

Achaqueinstructionduprogramme,nousassocionsunensemble dénom-brabled'instancesd'instruction,de manièretellequedeuxconditions soient remplies:

 L'ensemble desinstances associéesà chaque instructionest déni sta-tiquement;

 Uneinstanced'instructionestexécutéeaumaximumunefoisdansune exécutiondonnéedu programme.

Bien évidemment, le faitqu'une instance soit exécutée ou nonn'est pas, engénéral,dénistatiquement.Ensomme,uneinstanced'instruction corres-pond à une exécution a priori possible d'une instruction, pour autant qu'on puissele prévoir statiquement.

Atouteinstructionduprogramme,estassociéunvecteurd'indices, éven-tuellement vide,dont chaquecomposanteprendses valeursdansl'ensemble desentiersrelatifs.Uneinstanced'instructionseraalorsobtenueenassignant unevaleurentièreàchaquecomposanteduvecteurd'indices.Cevecteur d'in-dices estdénirécursivement commesuit. Soitaune instruction:

 Sian'est pascontenu dansun do, un pdo niun while, sonvecteur d'indices estvide:dansce cas, agénèreune instanced'instruction.

Dans les autres cas, considérons la boucle la plus interne (autrement ditlaplus immédiate) contenant a. Soitc latête de cette boucle,et i levecteur d'indices (éventuellement vide)de c.

 Si c est une tête de boucle do ou pdo, le vecteur d'indices de a est obtenu par laconcaténation de i et d'une composante j, notée i::j. j correspondà l'indice d'itérationde laboucle.

(25)

conca-positives, numérotant les itérations successives a priori possibles du while.

Delasorte,àtraverslesdeuxdernièresrègles,chaqueinstancec(i) (exé-cutéeounon)génèreuneinnité dénombrable d'instancesa(i:: j)mais,dans toute exécution du programme ne conduisant pas à une boucle innie,seul unensemblenide cesinstances est exécuté.

2.2 Le modèle d'exécution

An quenos résultats présentent une bonne généralité, nous ne devons pas spécier entièrement le modèle d'exécution de notre langage, mais en préciser seulement certaines caractéristiques que nous supposerons dans la suite.Nousnousinspirons ici de lapropositionde norme X3H5[43 ].

Deux notions importantes vont être introduites: la notion de processus etlanotiond'unité de travail.

 L'exécution duprogramme commence avecun processus initial.

 Unprocessuss'exécutejusqu'àcequesurviennel'unedescirconstances suivantes:

- ilatteintlanduprogramme(terminaisonnormalecelanepeut arriver qu'au processus initial);

- ilrencontreune construction parallèle;

- ilrencontrelan d'uneconstruction parallèle; - ilrencontreun wait;

- ilrencontreune erreur d'exécution.

 Quand unprocessusrencontre une construction parallèle,il devient le processus de base pour cetteconstruction. Cetteconstruction parallèle spécie un certain nombre d'unités de travail: chaque itération d'un pdo et chaque section d'un psections est une unité de travail. Une équipe deprocessusestcréée.Chaqueunitédetravailestassignéeàun certain processusde cette équipe,dansun certainordre. Ainsi, à par-tir dece point,chaqueprocessusa enchargeuneou plusieursunité(s) de travail

2

. (Comme nous autorisons les constructions parallèles em-boîtées, cette dénition des unités de travail et des processus opère

2.On peut concevoir, en une variante, que cette assignation d'unités de travail aux processussoitdynamique:parexemple,lesunitésdetravailgénéréesparlaconstruction parallèle seraient conservées quelque part puis aectées aux processus de l'équipe à mesurequeceux-ciselibèrent.Unetellevariantepeutaccroîtrelarapiditédel'exécution,

(26)

récursivement: une unité de travail peut spécier des sous-unités; un membrede l'équipede processuspeut à sontourdevenir processusde base,etainside suite.)

Lorsquele processusde base crée une équipe de processus, descopies des variables intervenant dans la construction parallèle sont consti-tuéespourchaqueprocessusdel'équipe;lescalculssontalorseectués localement danschaqueprocessusde l'équipe.

 Lorsqu'unprocessusaterminél'exécutiond'uneunitédetravail, l'exé-cutionpasseàl'unitésuivantequiluiestassignée,lecaséchéant (nous dironsquel'unitésuivanteestchargée);siceprocessusaterminé l'exé-cutiondetouteslesunitésde travailquiluiavaientétéassignées,il at-tendquelesautresprocessusdelamêmeéquipeterminentleurtravail.

 Sietquandtouslesprocessusdel'équipeont terminéleurtravail,cela signiequetoutes lesunités de travailde laconstruction parallèle ont été exécutées. Alors, les processus de l'équipe communiquent au pro-cessusde baselesvaleursdesvariablesqu'ilsont modiées (onparlera demiseà jourdesvariables);ensuite, l'équipe estdissouteetson pro-cessus de base poursuit l'exécution. (C'est seulement alors, que nous dironsque leendpdo ou endpsections estexécuté.)

3

 Une tellemise à jour de variables intervient aussilorsqu'unprocessus del'équipe exécuteune instance d'unpostou d'un wait. Cettemise àjour correspond au fait qu'une instance de waita pour destination d'attendre l'exécution d'une certaine instance d'un post, l'intention sous-jacente étant que  par exemple  une certaine valeur calculée avant le post dans son processus, soit eectivement disponible juste aprèslewait danslesien.

Nousavonsexpliqué(Ÿ2.1)commentunwaitattend qu'unpostait posté l'événement correspondant, et s'exécute seulement alors. Plus précisément,lorsqueleprocessusparvientàuneinstanced'unwait,il examinequelévénementestréférencé(cequipeutnécessiterdescalculs en cas de référence dynamique). Si cet événement n'est pas posté à ce moment, cet examen est réitéré jusqu'à ce que, éventuellement,

3.Onpourraitintroduiredansnotrelangagelanotiondevariableprivée(évoquéedans la proposition de norme X3H5 [43 ]), variable temporaire utilisée localement à chaque processus del'équipe,non destinéeàêtrecommuniquéeentreprocessus,nefaisant donc pasl'objetdesmisesàjourévoquéesici,niparconséquentdesvéricationsultérieuresde préservationsdedépendances.Unetelleintroduction,assezsimpledèslors queréférences privées etréférencespartagées (nosvariables)seraientclairementdistinguables,n'a pasétéfaiteicipournepasalourdirencorel'exposé.Toutefois,lesindicesdebouclesdoet pdosontsupposésiciavoircestatutdevariablesprivées,dansd'éventuellesconstructions

(27)

l'événement ainsiexaminé soit posté 4

.

 Encequiconcernelesmisesàjourdevariablesquenousavons mention-nées, il peutnaturellement seprésenter desconits, reétant un indé-terminismeinhérentàl'exécutionparallèle.Iln'estpasfaitd'hypothèse ici surce qu'iladvient lorsquedetels conitsseprésentent.L'objetde notredémarcheseraprécisément dedétectersidetelsconitsrisquent de se présenter (circonstance indésirable) ou si nouspouvonsgarantir qu'il n'y enaurapas(propriété souhaitée).

Par ailleurs, il n'est pas fait d'hypothèse sur la survenance ou non de mises à jour de variables dans des circonstances autres que celles que nousavonsmentionnées ci-dessus:laterminaison d'une construc-tion parallèle et les synchronisations post/wait

5

. Toutefois, en ce quiconcernel'exécutiond'uneinstanced'instruction parunprocessus, nous ferons l'hypothèse que cette instance collecte ses entrées le cas échéant,puiseectuesescalculslecaséchéant,puisproduitsessorties lecaséchéant,sansinterférenced'unemiseàjour devariablespendant les calculsen question.

 Nousaborderons plus loinle problèmedeserreurs d'exécution.

Il estimportant de bien faire la distinction entre ces deux notions, très diérentes, de processus et d'unité de travail. La génération des processus, au cours de l'exécution, est tributaire des ressources disponibles sur la ma-chine à ce moment-là: c'est un phénomène très dépendant de la machine. Aucontraire, lacaractérisation desunités de travail dépend uniquement de lasémantique du programme considéré, telle qu'elle se déploie au cours de l'exécution; dansla mesure où le programme sera correct dans notre sens, cettecaractérisation seraindépendante dela machine.

Dans de nombreuses implémentations, le nombre maximum de proces-sustournant simultanément n'excèdepasquelquesunités.Parconséquent,il seratout àfaitcourant queplusieurs unités de travailse trouvent assignées à un même processus, qui les exécutera successivement. Par ailleurs, dans le cadre où nous nous plaçons, nous souhaiterons que la correction de nos

4.Danslemodèled'exécutiond'uneinstancedewaitcomportantuneréférence dyna-mique,unpointn'est paspréciséici:lesvariablesintervenantdanslaréférence d'événe-mentsont-ellesréévaluéesàchaquetentative,oubiensont-elles luesunefoispourtoutes lorsquel'instanceestatteinte(auquelcaslewaitattendtoujourslemêmeévénement)? Nousn'avonspasbesoind'opterentrecesdeuxmodèlesd'exécutionpossibles:nos résul-tatss'appliquentdansl'uneetl'autreoptions.

5.Remarquonscependantqu'unmodèled'exécutionecaceéconomiseraaumaximum cesmises à jour de variables,car ilest bien connu que les transferts de donnéesentre mémoiressontcoûteux(vonNeumannbottleneck [40],parexemple).Parailleurs,dans cetteperspective d'économie,ilest possible, pourlimiter les mises àjour associées aux synchronisations,d'envisagerdessynchronisationspost/waitàpassagederéférences:se

(28)

a0: A(0)=... p0: post E(0) pdo I=1,N ... w: wait E(I-1) b: ...=A(I-1) a: A(I)=... p: post E(I) ... endpdo

Fig.2.1: Un exemple d'utilisation du post/wait

programmes parallèles soit assurée indépendamment du nombre de proces-susquiserévélerontdisponiblespourune exécution.Elledevra êtreassurée mêmedanslecaslimiteoùnotreprogrammeparallèle devraits'exécutersur unseul processus àplusforte raison,danslecasoùunecertaine construc-tion parallèle de notre programme trouverait un seul processus disponible pour s'exécuter,aucoursd'uneexécution multiprocessus de l'ensembledu programme.Il faudranotamment éviter lephénomène deblocage enattente nousyreviendrons dansuninstant.

Un exempletypique desynchronisation parévénements estmontrédans la gure 2.1. Dans cette boucle parallèle, les synchronisations sont conçues pours'assurerquelavaleurdeA(I 1)utiliséeparl'instructionbàl'itération I estlavaleur calculéeparl'instructionaàl'itération I 1(ou,pour I =1, par l'instructiona0):eectivement, l'instructiond'attente wàl'itération I attend que l'événement E(I 1) ait reçu la valeur posted par l'instruction postpàl'itérationI 1(ouparl'instructionp0pourI =1).Bienentendu, il ne faut pas que les événements E(I) se soient trouvés posted avant cette boucle sans devenir cleared entretemps, ni qu'ils soient posted ailleurs en parallèle,dans lecasoù l'élément deprogramme montré iciserait lui-même inclusdansune construction parallèle englobante.

Une unité de travail en train d'attendre sonexécution surun processus seraditeensuspens.Plusprécisément,encequiconcernelesinstances d'ins-tructions,lapremièreinstanced'unetelleunitédetravailseraditeensuspens àcemoment-là(nousverronsplusloin(Ÿ4.2)pourquoiseulelapremière sera ainsiqualiée)

6 .

6.Dansle cas oùcette instanceest unwait,nousdirons qu'elleestensuspens aussi longtempsqu'ellen'estpaschargée;elledevientatteinteaussitôtqu'elleestchargée,eten

(29)

Les erreurs d'exécution

Une erreur d'exécution correspond à une circonstance où l'exécution d'une instance d'instruction crée une opération interdite par le langage ou l'environnement d'exécution, desorte quel'exécutions'arrête àce point (on parlerafamilièrementdeplantage).Ilpeuts'agir,parexemple,d'unedivision par zéro, ou d'undébordement de tableau, ou de l'entrée/sortie d'un objet detype non conforme àcelui de laréférence...

Nousdevonsenvisager,dansnotremodèled'exécution,l'éventualité d'er-reursd'exécution. Eneet,sinousferonsl'hypothèse quelaversion séquen-tielle de notre programme ne présentera pasde telles erreurs, nousne pou-vons pas supposer, a priori, la même hypothèse en ce qui concerne notre programme parallèle, car nous voudrons montrer des propriétés d'équiva-lence sémantique en nous référant seulement à la sémantique séquentielle (nousyreviendronsplus loin:Ÿ2.3).

Concernantl'eetd'uneerreurd'exécutiondansunprocessus,nousallons fairel'hypothèse simplicatrice suivante:lasurvenued'uneerreur à l'exécu-tion d'une instance d'instruction dépend exclusivement des entrées sur les-quelleselleentreprenddes'exécuteretdescalculsqu'elletented'eectuersur cesentrées. Elle ne dépend donc pasde ce qui peut advenir simultanément sur d'autres processus tournant en parallèle (sauf, bien entendu, à travers l'eetéventueldecesautres processussurlesentréesde cetteinstance).Par conséquent,lorsque leprocessusdanslequel survient cette erreur faitpartie d'une équipe de processus (en train d'exécuter une construction parallèle), ceprocessussebloque,naturellement(onparleradeblocageenerreur);mais celane provoquepas leblocageimmédiat desautres processus enparallèle. Cettehypothèsen'estpasrestrictivedansnotredémarche,danslamesureoù nousdémontreronsque, sousdesconditionsdonnées, iln'yaurapasd'erreur d'exécution se conformant à cette hypothèse dans notre programme paral-lèle,donc pasdavantage d'erreur induite enparallèle si nouslevions cette hypothèse.

Blocages et boucles innies

Dans le langage que nous considérons, il y a trois manières pour un programmede ne passe terminernormalement: ilpeutarriver àun blocage en erreur, ou bien à un blocage en attente, ou bien entrer dans une boucle innie.

Unblocageenattenteimpliquenécessairementuneinstanced'instruction waitdontl'événementpersisteànepasdevenirposted.Danslecas(habituel) où ce wait est localisé dans une construction parallèle, une situation de blocageen attente peutêtredécrite commesuit:

(30)

non exécutées; par conséquent, les unités de travail correspondantes neseterminent pas;

 Enconséquence,l'exécutiondelaconstructionparallèle nepeut passe terminer;

 En conséquence éventuelle, il peut se faire que des unités de travail ne commencent pas leur exécution parce qu'elles sont assignées à un processus après une unité de travail bloquée, alors qu'elles seraient exécutables en principe. La première instance d'une telle unité de travailsera ditebloquée ensuspens.

 Enprésencedeconstructionsparallèlesemboîtées,unblocagedansune construction englobée entraîne une situation deblocagesimilairedans laconstruction englobante.

Une situationde blocageen erreurauradeseetstrès semblablesàceux d'unblocageenattente.Unepetitediérenceàremarquerici:tandisqu'une instanced'instructionbloquéeenattenteouensuspensseraditenepasêtre exécutée, une instance donnant lieu à un blocageen erreur est exécutée: c'estprécisément sonexécution qui produit une erreur.

Une boucle innie peut survenir seulement du fait d'un while (se sou-venir ici de l'absence de goto et du fait que les bornes de boucles do et pdosontévaluéesunefoisàl'entréedelaboucle).L'instanceendwhile cor-respondante n'est alors jamais exécutée; nous dirons qu'elle est bloquée en suspens.(Ainsi,ilexiste deuxmanièresdiérentes, pour uneinstance,d'être bloquée ensuspens;endépitdeleurdiérencedenature,nousremarquerons quelquessimilitudes entre lesdeux situations.)

Lorsqu'un while est inclusdans une construction parallèle, une boucle innie dans ce while entraîne une situation similaire à celle créée par un blocage.

L'assignation séquentielle

Considérons une construction parallèle, et une paire post/wait asso-ciant deux unités de travail de cette construction. Dans de nombreuses si-tuations, nous l'avons mentionné, il y aura moins de processus disponibles pour l'exécution de cette construction que d'unités de travail générées par elle. Il arrivera donc très souvent que plusieurs unités de travail soient af-fectées à un même processus. Si donc nous n'imposions aucune condition d'assignation des unités de travail aux processus, il pourrait advenir la cir-constancesuivante:l'unité de travail contenant le post setrouverait aec-téeau même processus quecelle contenant le waitcorrespondant, et après

(31)

l'exécution dupost situé après lui surle même processus, empêcherait par là-même celle-ci!). Il est donc impératif d'incorporer, dansle modèle d'exé-cution,unedispositionévitantdetels fauxblocages.Cettedispositiondoit satisfaireles deuxconditions suivantes:

 Simplicité: Cettedisposition doit, bien entendu, être applicable préa-lablement à l'exécution eective des unités de travail en question, ne requérir aucuneanalysene dessynchronisations enprésence,ni, bien entendu, aucuneintervention spéciquedu programmeur.

 Indépendance par rapport aux ressources disponibles: Elle doit per-mettred'éviterlessituationsde fauxblocage quelquesoitlenombre de processus disponibles  donc, même dans le cas limite où le pro-gramme s'exécutesurun seulprocessus.

Noussommes ainsiamené àprescrire lacondition suivante 7

:

Condition SA (Assignation séquentielle) Dans toutes les construc-tions parallèles contenant des instructions de synchronisation (c'est-à-dire des instructions post, wait et clear), l'attribution des unités de travail auxprocessus disponibles s'opère detellesorteque lesunités detravail aec-tées à chaque processus s'y succèdent dans l'ordre séquentiel: l'ordre déni par l'indice d'itération pour les pdo, l'ordre textuel des sections pour les psections.

Cetteconditiond'assignationséquentiellesecombinenécessairementavec uneprescriptiondeprogrammationselonlaquelle,dansunepairepost/wait, l'instancedupost doitprécéder l'instancedu waitdansl'ordreséquentiel, and'éviterdessituationsdeblocagemêmelorsquelaconstructionparallèle s'exécute sur un seul processus disponible (situation dans laquelle la seule assignationvériant laconditionSA correspond àl'ordre séquentiel).

La gure2.2présente, àtitred'exemple, desassignations de 9unités de travail(numérotéesdansl'ordreséquentiel)à3processus.Seulecellegurant àdroite est interdite, en raison desunités de travail marquées par ,quine setrouvent pasdansl'ordre séquentielsurleur processusrespectif

8 .

7.Cette conditioncorrespond àl'utilisation del'optionordered danslaproposition denormeX3H5[43 ].

8.LaconditionSAadoptéeiciestenquelquesorteuneversionminimalejustenécessaire pourobtenir nos propriétéssémantiques.Dansuneimplémentation denotrelangage, il estpermisetrecommandédelarenforceréventuellementpardescritèresd'ecacité. Parexemple,surlagure2.2,enl'absenced'informationapriorisurlessynchronisations, lapremière distributionà gauche estplus recommandéeque la deuxièmeàgauche, qui

(32)

P1 P2 P3 P1 P2 P3 P1 P2 P3 P1 P2 P3 --- --- --- ---1 2 3 1 5 8 1 2 3 1 2 4* 4 5 6 2 6 9 6 5 4 6* 7 3* 7 8 9 3 7 9 7 8 5* 8 9 4

OUI OUI OUI NON

Fig. 2.2:Assignation séquentielle:3 distributions permises, 1 défendue

Introduire des instructions de rendez-vous?

Le mécanismederendez-vousestuneforme desynchronisationquenous n'avonspasenvisagéedansnotrelangagenousallonsvoirpourquoi.Dansce mécanisme,deuxinstancesd'instructionsappariéess'attendentl'unel'autre, en ce sens que c'est seulement lorsque l'exécution a atteint l'une et l'autre instances,chacunedanssonunitédetravail respective,qu'ellepeutse pour-suivredanslesdeuxprocessusconcernés(nousavonsdéjàrencontré,àpropos de CSP, ce genre de communication synchrone (chap.1)). Il est aisé de voir qu'unrendez-vousestéquivalentàunsystèmededeuxpairespost/wait en-trecroisées.Surlagure2.3,estreprésentéàgaucheunexempled'utilisation dumécanismederendez-vous.Lecomportementobtenuestsémantiquement équivalent àceluiproduitparlaportiondeprogrammereprésentéeàdroite. Il est important d'observer ceci: toutes les fois que deux unités de tra-vailliéesl'uneàl'autreparunrendez-vous,setrouveront aectéesaumême processus, celacréera une situation deblocage.C'est pourquoi,dansle lan-gage quenous considérons, compte tenu de notre modèle d'exécution et de la condition d'assignation séquentielle, nous ne pouvons pas introduire de structure derendez-vous.

2.3 La correction séquentielle. La notion d'équiva-lence sémantique.

Par dénition, la version séquentielle d'un programme parallèle est le résultat de la transformation de pdo en do, l'eacement des instructions psections,section etendpsections, etladésactivation desinstructions post, wait et clear: par désactivation, nous voulons dire que, dans la version séquentielle dénie ici, elles sont converties en instructions qui ne font rien (notées continue ici), mais nous conservons la possibilité, dans lesdéveloppementsquisuivent,degardertracedesréférencesd'événements, nousautorisant àconsidérercequ'iladvientdecesréférences,commesielles

(33)

psections psections section section ... ... rendezvous(E) post E1 wait E2 ... ... section section ... ... rendezvous(E) post E2 wait E1 ... ... endpsections endpsections

Fig.2.3: Le mécanisme derendez-vous

Dans la plus grande partie de cette étude, nous nous plaçons dans la situation où le comportement observable (les calculs eectués sur les va-riables) quenoussouhaitons obtenir de notre programme parallèle est celui desaversionséquentielle,quiserasupposéeseconformerauxrèglesdenotre langage,etdont lasémantique estdonc biendénie. Dansce cadre,un pro-gramme parallèle correct peut être vu comme une certaine parallélisation d'unprogramme séquentiel sous-jacent, et non commeun programme fon-damentalement parallèle. L'avantage recherché à travers la parallélisation consistealorsseulementenlapossibilitéd'exécuterleprogrammeplusvite.

La gure 2.4 présente l'élément de programme parallèle montré dans la gure 2.1, ainsi que sa version séquentielle, qui xe la sémantique de référence:lavaleurcalculée par l'instanced'instruction a(I 1)est utilisée comme entrée de l'instance d'instruction b(I), comme spécié par l'ordre séquentield'exécution de la boucledo. Les instructions de synchronisation wetpontétéintroduitesdanslaversionparallèleandepréservercetordre d'exécutionlorsque ledoest paralléliséen pdo.

Notre objectif est de prouver la correction (ou la non correction) d'un programme parallèle, dans ce sens. Nous voudrions montrer que toutes les variablesvenant àêtrecalculéesdoivent,danslesdeuxversions,fairel'objet desmêmes calculs et, par conséquent, présenter les mêmes valeurs (équiva-lence sémantique).

Nous imposons, dans notre langage, une condition de détermination, comme un prérequis pour la correction de notre programme (plus préci-sément, de saversionséquentielle):

(34)

program-a0: A(0)=... A(0)=...

p0: post E(0) continue

pdo I=1,N do I=1,N

... ...

w: wait E(I-1) continue

b: ...=A(I-1) ...=A(I-1)

a: A(I)=... A(I)=...

p: post E(I) continue

... ...

endpdo enddo

Fig. 2.4: Un élément de programme parallèle (à gauche) et sa version sé-quentielle (à droite)

cutéeaétéinitialiséeaupréalable;demême,toutindicedeboucledooupdo utilisécommevariabled'entrée aprèsla boucle,aété initialiséaprèslaboucle etantérieurementà cette utilisation.

Sous cette conditionde détermination, nousexprimons l'équivalence sé-mantiquede lamanièresuivante:toute instance d'instruction exécutée dans une quelconque exécutionparallèle est aussi exécutée dans la version séquen-tielle,etinversement; toute référence gurant danscetteinstance d'instruc-tion en entrée désigne la même variable, et cette variable a été calculée par la même autre instance d'instruction, dans une quelconque exécution paral-lèle,que danslaversionséquentielle.(Enconséquence,cettevariablerecevra eectivement la même valeur dansles deuxexécutions.)

Lavéricationdel'équivalencesémantiquesupposedevérierquele pro-gramme parallèle ne se bloquera pas, quel que soit le nombre de processus disponibles;etaussiqueserontévitésdesconitsmémoire(chap.1).Toutes les foisque deuxinstances d'instructions font référence à lamême case mé-moire dans la version séquentielle, l'une au moins en écriture, nous dirons qu'elles sont dans une relation de dépendance (notée Dep). Il nous faudra alors vérier queces instances d'instructions sont dansune relation de pré-cédence, c'est-à-dire que lastructure de contrôle du programme parallèle et les synchronisations préservent l'ordre danslequel ces instances seront exé-cutées, etassurent la miseà jour nécessairedes variables entretemps. Nous retrouvonslàleschémabienconnudépendance impliqueprécédence [3]. In-sistonsbienici surl'importance de cettenotion demiseàjour de variables: lemotprécédence risqued'induireenerreur,sil'onn'yprendpasgarde,en laissantcroire qu'ils'agirait seulement d'assurer unesuccession temporelle.

Par exemple,selon notremodèled'exécution, une synchronisation post/waitest une précédencedansnotresens.

(35)

assez particulière qui n'est pas nécessairement présente dans toute étude concernant le parallélisme. De fait, nous aborderons au chapitre 7 des ex-tensionspossibles:dessituationsdanslesquellesl'exigence d'équivalence sé-mantiquesera aaiblie (sections critiques).

(36)

Chapitre 3

Dépendances et précédences

Lethéorèmequenousprésentonsiciseréfèreàlasémantiquedelaversion séquentielleuniquement.Lepointessentieldece résultatestde montrerque la vérication de la relation dépendance implique précédence sous la sé-mantiqueséquentielle(valeursséquentielles desvariables,etc.)assure eec-tivementl'équivalence sémantiqueentreleprogrammeparallèle etsaversion séquentielle. Dans le cadre de ce résultat, nous serons conduit à considérer laconditionpourqu'uneinstanced'instruction soitexécutéedansla version séquentielle(prédicat Exe

s

), qui estbien déniedans notrelangage;le pré-dicatdedépendanceDepquiconcernelaversionséquentiellepar dénition; et le prédicat de précédence Pre

s

qui exprime les relations de précédence qui s'appliqueraient dans le programme parallèle, en conséquence du modèle d'exécution, si l'on suppose que les variables gurant dans la dénition de ces relations reçoivent leurs valeurs séquentielles.

1

Dans lasuite denosdéveloppements (chap.4et5),nousseronsamené à considérer,avec les précautions nécessaires,les analoguesparallèlesde Exe

s etPre

s

Exe etPrerespectivement  qui,aussilongtemps quel'on n'apas prouvél'équivalencesémantique,nesontdénisqu'enréférenceàune exécu-tiondonnéeduprogrammeparallèle(ilspeuventdiérerpourdesexécutions diérentes du même programme parallèle). Considérant une exécution par-ticulière, le prédicat de précédence Pre associé à cette exécution exprime les relations de précédence qui s'appliquent à cette exécution, en vertu du modèle d'exécution, en considérant les valeurs danscette exécution des va-riables gurant dans la dénition de ces relations. Nous y reviendrons plus loin(Ÿ3.3.3).

1.Uneconséquence de cettedénitionde Pre s

,est que larelationexprimée par Pre s s'appliqueen particulieràlaversion séquentielleelle-même.Autrement dit,pourtoutes instancesd'instructions et exécutéesdanslaversionséquentielle,Pre

s

(37)

3.1 Le prédicat d'exécution séquentielle

Soit Exe s

la condition d'exécution d'une instance d'instruction dans la versionséquentielle, sous la condition supplémentaire que le programme sé-quentielsetermine,c'est-à-direnebouclepassurun while.Alors,Exe

s est bien déni (bien qu'il ne soit en général pas calculable!) et son expression estassez simple danslecasde notrelangage.

Pouruneinstructionaetunvecteurd'indicesitelquel'instancea(i)soit exécutée dans la version séquentielle, nous pouvons considérer l'environne-mentdanslequell'exécutiondea(i) alieu.Pour touteexpressionexpvenant àêtre évaluée au cours de l'exécution de a(i), savaleur est déniedans cet environnement:elleseranotée[[exp]]@a(i).(Remarquonsque,toutappelàun sous-programmeseterminant dansnotrelangage,l'évaluationd'une expres-sion setermine toujours.) Remarquons bien que [[exp]]@a(i) n'est pas déni danslecasoùa(i) n'estpasexécuté.Celanousconduit,danslesexpressions quisuivent,à faire usagede laconjonction séquentielle, notée&, qui dière delaconjonction logique,notée^,delamanièresuivante:siAetB sontdes expressions booléennes (prenant les valeurs vrai, faux ou indéni), A & B est fauxdès lors que A est faux, même si B est indéni, tandis que A^B estindéni dansce cas

2 . ExprimonsExe

s

(a(i))pouruneinstructionaindexéepari.Plusieurscas doivent être considérés, enfonction de l'inclusion de a dansune instruction structurée (boucle ou if).Dans le casd'une telle inclusion, nous considére-ronsl'instructionstructurée laplusinterne danslaquellesetrouvea, celle danslaquelle a est le plus immédiatement contenu. (Ici et dans tout ce qui suit,:désigne lanégation logique.)

 a n'est pas contenu dans un do, un pdo, un if ni un while: alors, Exe

s

(a)=vrai.

 aestimmédiatementcontenudansunifdetêtec,avecpourexpression de test c:bexp.Soit i levecteur d'indices dec et a:

 sia estdanslabranche then, Exe

s

(a(i))=Exe s

(c(i))&[[c:bexp]]@c(i)

 sia estdanslabranche else, Exe

s

(a(i))=Exe s

(c(i))&:([[c:bexp]]@c(i))

2.Demanièrecohérenteaveccetaspectséquentiel,dansce quisuit, les conjonctions sont associatives à gauche: par exemple, A^B & C^D s'interprète comme: ((A^ B)&C)^D.Enoutre,danstouslescas oùuneexpressionCpeut êtreindénie siune certaineautreexpressionAestfausse,nousviseronsàcequeCapparaisseseulementdans desexpressions (:::^A^:::) &C :::, desorte queles expressions quienrésultent soient

Figure

Fig. 1.1: Une boucle parallèle et sa version séquentielle
Fig. 2.1: Un exemple d'utilisation du post/wait
Fig. 2.2: Assignation séquentielle : 3 distributions permises, 1 défendue
Fig. 2.4: Un élément de programme paral lèle (à gauche) et sa version sé- sé-quentielle (à droite)
+7

Références

Documents relatifs

Structure de base d ’ un GRAFCET F  Séquence : suite linéaire d ’ étapes activées les une après les autres Une séquence est active si au moins une étape est active.. IV-

c) Avec l’épreuve séquentielle non-exhaustive, convenir d’un tronquage est une obligation ; avec l’épreuve séquentielle exhaustive, on n’est jamais dans une telle

On est parfois conduit à avoir recours au tronquage d’une épreuve sé- quentielle et cela soulève quelques difficultés du point de vue de la valeur des risques

In the present study we test the hypothesis that the physical constraints related to underwater prey capture constrain head shape evolution in aquatic snakes..

du plus ourt hemin dans un ontexte multi-objetif, pour lequel nous avons fait une. première étude est le seul point non onluant fera l'objet d'un pro jet

Dans ce cours, nous nous intéresserons plus particulièrement aux Grafcet (Partie B) qui permettent de représenter le fonctionnement de la partie commande de systèmes automatisés

Logique

La figure suivante donne le chronogramme des signaux appliqués aux entrées J, K et Clk d'une bascule J-K maître-esclave.. Polytech Marseille INFO3 TD d'Architecture :