Vous êtes sur la page 1sur 85

BenoitSemelin2005

MthodologieM2

Programmation parallle pour le calcul scientifique


BenotSemelin 2008

BenoitSemelin2005

Introduction Gnralits

BenoitSemelin2005

Bibliographiegratuite
Paralllismeengnral:
http://aramis.obspm.fr/~semelin/enseignement.html:cecours http://wwwunix.mcs.anl.gov/dbpp/index.html:livreenlignesurleparalllisme

OpenMP:
http://www.openmp.org/specs/:spcificationsofficielles http://www.idris.fr/data/cours/parallel/openmp/OpenMP_cours.html:Coursdel'IDRIS

MPI:
http://www.idris.fr/data/cours/parallel/mpi/mpi1_cours_couleurs.pdf:Coursdel'IDRIS http://www.mpiforum.org/docs/mpi11html/mpireport.html:Manuelderfrence(html) http://www.idris.fr/data/cours/parallel/mpi/mpi1_aide_memoire_F90.html http://www.idris.fr/data/cours/parallel/mpi/mpi1_aide_memoire_C.html http://wwwunix.mcs.anl.gov/mpi/tutorial/mpiexmpl/contents.html(ExemplesenC)

BenoitSemelin2005

Lecalculparallle: qu'estcequec'est?

Fairecooprerplusieursprocesseurspourraliseruncalcul
Avantages: Rapidit:
PourNprocesseurs,tempsdecalculdivisparN,enthorie.

Taillemmoire:
PourNprocesseurs,ondisposedeNfoisplusdemmoire(engnral)

Difficults:
Ilfautgrerlepartagedestches. Ilfautgrerl'changed'information.(tchesnonindpendantes)

BenoitSemelin2005

Qu'estcequin'estpas ducalculparallle.
Quandlesprocesseursnecooprentpas:
Calculsmonoprocesseurssquentiels Calculsmultiprocesseurs:

Excutionpourunesriedeconditionsinitiales diffrentes. Problmedivisibleensousproblmesindpendants:


extrieur.

Exemple:MouvementdeNparticulestestdansunchamp Unearchitectureparallleefficacecotecher,ilfautl'utiliserbon escient.

BenoitSemelin2005

Modlesdeparalllisme
Architecturematrielle:

SISD
Single Instruction SingleData

SIMD
SingleInstruction MultipleData

MIMD
MultipleInstruction MultipleData

PC monoprocesseur

Architecture vectorielle monoprocesseur

Architecture parallle multiprocesseur

Modledeprogrammation:

SPMD
Leplusutilis
SingleProgram MultipleData

MPMD
MultipleProgram MultipleData

Unseulprogramme (nprocesseur=variable)

Crationdynamiquedeprocess Modlematreesclave.

Outilsdeparalllisation:

OpenMP
ordinateur mmoirepartage

MPI
ordinateur mmoiredistribue

BenoitSemelin2005

Mmoirepartage/distribue
Messages

CPU

CPU
criture Lecture

CPU

CPU

CPU
criture Lecture

CPU

MmoireRAM

Mmoire RAM

Mmoire RAM

Mmoire RAM

Mmoirepartage(SMP)
Tous les processeurs ont accs l'ensembledelammoire.
Attentionauxconflits. Trspeudesurcotdeparalllisation. Leplussouventnbproc<64. Architecturecoteuse.

Mmoiredistribue
Chaque processeur possde sa propre mmoire. Il n'a pas accs celle des autres.
Ilfautgrerl'changedemessages(surcot) Architecturebonmarch. Ilfautajouterunrseaudecomperformant. Nbdeproc~illimit.

BenoitSemelin2005

Revued'effectif1: danslemonde
Touslesans,unelistedes500plusgrosordinateurestpubliesur: http://www.top500.org
Rang
1 2 3 4 5 6 7 8 9 10 +

Nom

Architecture Pays/Anne
USA / 2007

Nb Puissance de processeur calcul


219992 65536 14336 14240 13728 26544 23016 40960 19320 36864 01/04/08 478.6 Tflops 167.3 Tflops 126.9 Tflops 117.9 Tflops 102.8 Tflops 102.2 Tflops 101.7 Tfolps 91.2 Tflops 85.3 Tflops 82.1 Tflops ~ 1-4 Gflops

DOE/NNSA/LLNL BlueGene/L IBM FZL NMCAC Comp Research Lab TATA SONS Gov Agency NNSA/ Sandia nationnal lab Oak ridge National Lab Watson Research center NERSC/BNL NY center for Comp Sciences PC Maison

BlueGene/P IBM Germany/2007 SGI Altix (Xeon) Cluster HP (Xeon) USA/2007 India/2007

Cluster HP Sweden/2007 (Xeon) Cray Red Storm USA/2006 Opteron Cray XT4/XT3 BlueGene IBM Cray XT4/XT3 BLueGene IBM USA 2007 USA / 2005 USA/2007 USA/2007 Partout / 2005

BenoitSemelin2005

Revued'effectif2: l'astrophysiqueenFrance
Voicilesmoyensdecalculparallledisponiblespourla rechercheenFrance(nonexhaustif):
Nom (# top500)
CEA DAM (19) CEA (26) IN2P3 (229) IDRIS (> 500) IDRIS 2008 (< 5)

Type d'architecture
Nova 10 Noeuds de 8 bicoeurs Novascale Dell IBM Power4 Noeuds de 32 (SMP) Bluegene + Power6 IBM Power4 Noeuds de 32 (SMP) IBM Power3 Noeuds de 16 (SMP)

Nb processeur
9968 7680 3808 1024 ~45000 288 464

Puissance
52.8 Tflops 42.1 Tflops 8.5 Tflops ~ 6 Tflops ~200 Tflops

Condition d'accs
Secret Dfence Idem ? Sur projet dtaill Idem

CINES

Sur projet dtaill

SIO

Cluster Opteron/Xeon ~ 100 Coeurs

~ 0.3 Tflops

Sur projet pour les membres de l'observatoire

Evolution

BenoitSemelin2005

Outilsdeparalllisation
Laparalllisationpeuttreeffectuesdiversniveaux: Langages:

CompositionalC++(CC++) FortranM HighperformanceFortran(HPF) etc... MessagePassingInterface(MPI) ParallelVirtualMachine(PVM):~obsolte. Pthreads(langageC) OpenMP Instructionsspcifiquesconstructeur.

Bibliothques:

Directivesdecompilation:

Compilateurs:efficacittrsfaible.

IntelFortran/Ccompiler:gratuit.

BenoitSemelin2005

OpenMP

BenoitSemelin2005

OpenMP: modledeprogrammation

BenoitSemelin2005

Laparalllisationfacile: OpenMP
OpenMP est un ensemble de directives de compilation pour parallliseruncodesurunearchitectureSMP(interfacesFortran,C etC++)
LecompilateurinterprtelesdirectivesOpenMP(siilenestcapable!) Les standards d'OpenMP datent de 1997, ceux d'OpenMP2 de 2000. Les dveloppeursdecompilateurslesimplmentent. Modlesd'excutionOpenMP:
Procces principal Thread process( processeur)

Excution squentielle monoprocess

Excution parallle 9process

Excution squentielle monoprocess

Excution parallle 9process

Excution squentielle monoprocess

BenoitSemelin2005

Commentfairetourner uncodeOpenMP
Voiciquelquespointsderepre:
crirelecodesquentiel(toutoupartie) Dbuguerlemieuxpossible SeplacersurunemachineSMPmultiprocesseur(optionnel) InsrerlesdirectivesOpenMP Compileravecl'optionapproprie:ifortopenmptoto.f90ototo.out DfinirlenombredeCPU:exportOMP_NUM_THREADS=4 Lancernormalement:./toto.out Dbuguer... valuerlesperformances,enparticulierlespeedup: TempsexcutionNprocs/Tempsexcution1proc

BenoitSemelin2005

Syntaxed'unedirective OpenMP
Voiciunexemplededirectivepourf90:

Espaceen6imecolonnepourf77

!$OMP_DO_SCHEDULE(DYNAMIC,500)

Sentinelle:
Doit tre le premier caractre nonblanc de la ligne.!$peutservirde sentinelle de compilation conditionnelle pour une lignedecodenormale.

Directive:
Unedirectiveparligne.

Clause:
Optionnelle. Modifie le comportement de la directive. Il peut y en avoirplusieurs,ellepeut tre rpte, l'ordre est indiffrent

SyntaxeenC/C++:#pragma_omp_for_schedule(dynamic,500)

BenoitSemelin2005

OpenMP: rgionsparallles, comportementsdesvariables

BenoitSemelin2005

Dfinirunergionparallle
Commentamorcerunezone d'excutionmultiprocesseur:

SUBROUTINEcompute_grad(field,grad,n,size,TYPEMIN) USEVARIABLES INTEGER,INTENT(IN)::n REAL(KIND=8),INTENT(IN)::size REAL(KIND=8),DIMENSION(n),INTENT(IN)::field REAL(KIND=8),DIMENSION(n),INTENT(OUT)::grad INTEGER,INTENT(IN)::typemin REAL(KIND=8)::val,g1,g2,fx INTEGER::i,ip,im !$OMPPARALLEL !AutredirectiveOMP doi=1,NCELLNOW ip=i+1 im=i1 if(ip==NCELLNOW+1)ip=1 if(im==0)im=ncellnow if(celltype(i)>=typemin)then g1=(field(i)field(im))/(cellsize(i)+cellsize(im))*2. g2=(field(ip)field(i))/(cellsize(i)+cellsize(ip))*2. fx=(cellsize(im)+cellsize(i))/(cellsize(im)+2.*cellsize(i)+cellsize(ip)) grad(i)=(1.fx)*g1+fx*g2 endif enddo !$OMPENDPARALLEL ENDSUBROUTINEcompute_grad

Dbutdezone:
!$OMPPARALLEL #pragmaompparallel{code}

Findezone:

!$OMPENDPARALLEL

Danslazonecorrespondante,Nthreads sont excuts en parallle. N est fix par la variable d'environnement OMP_NUM_THREADS. Que devient la valeur d'une variable l'entre et la sortie d'une zone parallle?? Que vautelle sur 2 processeursdiffrents?

BenoitSemelin2005

Comportementspossibles d'unevariable
VariableSHARED
X=1.

VariablePRIVATE
X=1.

X=1. ... ... ... X=2.

X=1. ... ... X=X+1.


Dlai (cache,registre) contrlparFLUSH

X=1. ... ... ... ... X=2.

X=1. X1=? ... ... ... ... ... ... X=2. ... X1=2.53

X=1. X2=? ... ... ... ... X=X+1. ... ... X2=124.

X=1. X3=? ... ... ... ... ... ... ... ... X=2. X =2. 3

Xiindtermin. contrlablepar FIRSTPRIVATE

X=2.

X=2. X=?

Xindtermin. contrlablepar LASTPRIVATE

BenoitSemelin2005

ComportementSHARED/PRIVATE d'unevariable
SUBROUTINEcompute_grad(field,grad,n,cellsize,TYPEMIN) USEVARIABLES INTEGER,INTENT(IN)::n REAL(KIND=8),INTENT(IN)::cellsize REAL(KIND=8),DIMENSION(n),INTENT(IN)::field REAL(KIND=8),DIMENSION(n),INTENT(OUT)::grad INTEGER,INTENT(IN)::typemin REAL(KIND=8)::val,g1,g2,fx INTEGER::i,ip,im !$OMPPARALLELPRIVATE(ip,im,g1,g2,fx) !AutredirectiveOMP doi=1,NCELLNOW ip=i+1 im=i1 if(ip==NCELLNOW+1)ip=1 if(im==0)im=ncellnow if(celltype(i)>=typemin)then g1=(field(i)field(im))/(cellsize(i)+cellsize(im))*2. g2=(field(ip)field(i))/(cellsize(i)+cellsize(ip))*2. fx=(cellsize(im)+cellsize(i))/(cellsize(im)+2.*cellsize(i)+cellsize(ip)) grad(i)=(1.fx)*g1+fx*g2 endif enddo !$OMPENDPARALLEL ENDSUBROUTINEcompute_grad

SHARED et PRIVATE sont deux clauses qui spcifient le comportement des variables dans unezoneparallle:

SHARED: la variable a la mme valeursurtoutlesprocesseurs.C'estle statut par dfaut. Attention la synchro si on la modifie sur un processeur(directiveFLUSH). PRIVATE: la variable a une valeur diffrente sur chaque processeur (espace mmoire correspondant dupliqu)etindtermineenentrede zone. C'est le statut de toute variable dclare l'intrieur d'une zone parallle.

BenoitSemelin2005

Autresclausesde comportementsdevariables
Onpeutchangerlecomportementdfaut:
!$OMPPARALLELDEFAULT(PRIVATE|SHARED|NONE)

SionutiliseNONE,ondoitprciserlecomportementdetouteslesvariablesqui apparaissentdanslazoneparallle(exceptionsvoirrfrencesOMP)

Clausesupplmentaires:

FIRSPRIVATE(X): XestPRIVATEetinitialise savaleurjusteavantlazone parallle. REDUCTION(*,X): X est PRIVATE et un produit des valeurs de X sur les diffrents threads est effectu en fin de zone parallle et stock dans X. L'oprateur peuttre + , , * , .OR. , .AND. , MAX, MIN, etc... Remplace les statutsPRIVATEouSHARED. LASTPRIVATE(X): X est PRIVATE. La valeur de X du threads excutant la derniremisejourdeXestconserveenfindezoneparallle. COPYPRIVATE(X): Pour diffuser une variable prive (Directive SINGLE uniquement).

BenoitSemelin2005

VariablePRIVATEmais globale...danslazoneparallle
UnevariablePRIVATEestlocale. Comment conserver la valeur d'une variable PRIVATE d'une zone parallle l'autre? Ilestintressantdepouvoirappeleruneouplusieursprocdure/fonctiondansune zoneparallle. Certainesprocdures/fonctionsutilisentetmodifientdesvariablesglobales.

!$OMPTHREADPRIVATE(X,/COORD/)(Dansle.h) La variable X et le bloc commun /COORD/ seront PRIVATE mais globaux dans chaque thead des rgions parallles. Certains compilateurs Fortrann'acceptent que desblocscommunenargumentdeTHREADPRIVATE. !$OMPPARALLELCOPYIN(/COORD/)(Dansle.f90) Lesvaleursde/COORD/sontcopiesdanslesrpliquesprivesdechaquethread enentredanslesrgionsparallles.

BenoitSemelin2005

OpenMP: partagedutravail entrethreads

BenoitSemelin2005

Partagedutravail: distribueruneboucle
SUBROUTINEcompute_grad(field,grad,n,cellsize,TYPEMIN)

Ladirective DO seplace justeavantle USEVARIABLES dbut d'une boucle, elle rpartit les INTEGER,INTENT(IN)::n REAL(KIND=8),INTENT(IN)::cellsize itrationsentrelesprocesseurs.

PasdeDOWHILE!

Lemodederpartitiondpenddela !$OMPPARALLELPRIVATE(ip,im,g1,g2,fx) clauseoptionnelleSCHEDULE Le mode de rpartition par dfaut dpend de l'implmentation d'OpenMP.

REAL(KIND=8),DIMENSION(n),INTENT(IN)::field REAL(KIND=8),DIMENSION(n),INTENT(OUT)::grad INTEGER,INTENT(IN)::typemin REAL(KIND=8)::val,g1,g2,fx INTEGER::i,ip,im

Les itrations doivent tre indpendantes (ordreindiffrent).

A la fin de la boucle on insre la directive END DO. Les threads se synchronisent(onattendladernire). ENDSUBROUTINEcompute_grad

!$OMPDOSCHEDULE(DYNAMIC,20) doi=1,NCELLNOW ip=i+1 im=i1 if(ip==NCELLNOW+1)ip=1 if(im==0)im=ncellnow if(celltype(i)>=typemin)then g1=(field(i)field(im))/(cellsize(i)+cellsize(im))*2. g2=(field(ip)field(i))/(cellsize(i)+cellsize(ip))*2. fx=(cellsize(im)+cellsize(i))/(cellsize(im)+2.*cellsize(i)+cellsize(ip)) grad(i)=(1.fx)*g1+fx*g2 endif enddo !$OMPENDDO !$OMPENDPARALLEL

BenoitSemelin2005

Stratgiesderpartition desitrations

La clause SCHEDULE permet de contrler la stratgie de rpartition des itrations d'uneboucleentrelesprocesseurs,elleadmet2arguments:SCHEDULE(stratgie,N).

Stratgiespossibles: STATIC: Chaque thread reoit tour de rle N itrations traiter. La distribution
s'effectuedansunordrefix,ventuellementenplusieurstours.Nestoptionnel,siiln'est passpcifiN~nbitration/nbthreads.

DYNAMIC:ChaquethreadreoitNitrationstraiter.Dsqu'unthreadafini,ilen
reoitNautres,jusqu'puisementdutravail.Nestoptionnel,pardfautN=1.

GUIDED:

Les itrations sont divises en paquets de taille exponentiellement dcroissante. Les paquets sont distribus dynamiquement.La taille du plus petit paquet estN.

RUNTIME: Le choix de la stratgie est report au moment de l'excution. Il sera


alorsdterminparlecontenudelavariabled'environnementOMP_SCHEDULE.

DYNAMICetGUIDEDassurentunmeilleurquilibragedechargequeSTATIC.

BenoitSemelin2005

Unexemple: calculdepotentielpriodique
PROGRAMPOTPER IMPLICITNONE REAL(KIND=8),PARAMETER::BOXSIZE=1. INTEGER,PARAMETER::NREP=200 INTEGER,PARAMETER::NDEF=40 INTEGER::i,j,k,l REAL(KIND=8)::x1,y1,z1,x2,y2,z2,pot,dist y1=0. z1=0. doi=1,ndef x1=dble(i)/ndef*BOXSIZE pot=0. !$OMPPARALLELPRIVATE(k,l,x2,y2,z2,dist)REDUCTION(+:pot) !$OMPDOSCHEDULE(DYNAMIC) doj=nrep,nrep x2=dble(j)*BOXSIZE dok=nrep,nrep y2=dble(k)*BOXSIZE dol=nrep,nrep z2=dble(l)*BOXSIZE dist=sqrt((x2x1)**2+(y2y1)**2+(z2z1)**2) if(dist<BOXSIZE*NREP*0.95)then pot=pot+(x2x1)/(sqrt((x2x1)**2+(y2y1)**2+(z2z1)**2))**3 endif enddo enddo enddo !$OMPENDDO !$OMPENDPARALLEL print*,x1,pot enddo ENDPROGRAMPOTPER

Programme pour calculer une interactiongravitationnelleavec des conditions de bord priodiques. Remarques:
Il existe un algorithme plus efficace (dcomposition de la sommeendeuxparties). On pourrait parallliser la premireboucle! Remarquer l'utilisation de la clauseREDUCTION. Zones parallles longues => bon speedup

BenoitSemelin2005

Partagedutravail enl'absencedeboucle
...
!$OMPPARALLEL !$OMPSECTIONS !$OMPSECTION CALLUPDATE_XPOS() !$OMPSECTION CALLUPDATE_YPOS() !$OMPSECTION CALLUPDATE_ZPOS() !$OMPENDSECTIONS !$OMPENDPARALLEL ...

La directive SECTIONS amorce une zone o le code est dcoup en morceaux. END SECTIONS clt cette zone Ces morceaux sont spars par des directivesSECTION. Chaquemorceau(section)seraexcut unefoisuniqueparundesthreads. L'ordre d'excution des sections doit treindiffrent! SECTIONS admet PRIVATE, FIRSTPRIVATE, LASTPRIVATE, et REDUCTIONcommeclauses.

BenoitSemelin2005

Partagedutravailavec WORKSHARE
WORKSHARE, une directive trop gnrale/ambitieuse?
D'aprs les spcifications d'OpenMP WORKSHARE doit diviser le travail de telle manire que chaque instruction de la zone soit excute exactement 1 fois dansunthread,enrespectantlasmantiqueducode...Si les instructions ne sont pas indpendantes, pas de speedup. Auxfabricantsdecompilateursdel'implmenter.

!$OMPPARALLEL !$OMPWORKSHARE X(1:N)=sin(THETA(1:N)) Y(1:N)=cos(THETA(1:N)) WHERE(Y.ne.0)P=X/Y FORALL(i=1:N,j=1:N,i/=j) pot(i)=pot(i)+1./(x(i)x(j)) ENDFORALL !$OMPENDWORKSHARE !$OMPENDPARALLEL

Enpratique,utilisableenf90pour: Oprationssurlestableaux. InstructionWHERE InstructionFORALL WORKSHAREn'admetAUCUNEclause.

BenoitSemelin2005

Excutionexclusive: directivesSINGLEetMASTER
Si,dansunezoneparallle,onsouhaitequ'unepartieducodesoit excuteparunseulthread,onalechoixentre2directives:
!$OMPSINGLE/!$OMPENDSINGLE: Lepremierthreadquiabordelazonel'excute.Lesautressautentlafinet attendentqueceluiquiexcuteaitfini.SINGLEadmetlesclauses PRIVATEetFIRSTPRIVATE.ENDSINGLEadmetNOWAITet COPYPRIVATE. !$OMPMASTER/!$OMPENDMASTER: Lethreadmaster(numro1)excutelazone.Lesautressautentla zone,etn'attendentpas!MASTERn'admetaucuneclause.

Cesdirectivespeuventparexempleservirfairedesentres/sorties.

BenoitSemelin2005

OpenMP: synchronisationdesthreads

BenoitSemelin2005

Problmesde synchronisation.
Dansunezoneparallle,l'utilisationdevariablesSHAREDpeut crerdesproblmesdesynchronisation.Exemples:
3threadscalculentX(1),X(2)etX(3),puischacunutiliseles3valeurs.Il fauts'assurerquelesautresontfinitleurcalcul. Nthreadsincrmententla mme variable.Ilfauts'assurerqu'ilsnetentent pasd'crireenmmetempsdansl'emplacementmmoiredelavariable. Problmedevidagederegistreetdetampon.

BenoitSemelin2005

Synchronisationsimple: BARRIER

LadirectiveBARRIERsynchroniselesthreads:touss'arrteauniveau de la directive jusqu' ce que le dernier soit arriv. Puis il continuent tous.Syntaxe: !$OMPBARRIER N'admetaucuneclause. UneBARRIERestimplicitementinclusedanslesdirectives suivantes:

ENDPARALLEL ENDDO(saufclauseNOWAIT) ENDSECTIONS(saufclauseNOWAIT) ENDSINGLE(saufclauseNOWAIT) ENDWORKSHARE(saufclauseNOWAIT)

PasdeBARRIERimplicitedeENDMASTER!

BenoitSemelin2005

Mettrejourlammoire: directiveFLUSH
!$OMPFLUSH(x,y) Lorsqu'un thread rencontre une directive FLUSH, il met jour les variablesspcifiesentreparenthses,c'estdire: Ilvidelestamponsd'criture,lescaches,lesregistres.

Ilvrifiesiunautrethreadn'apasmodifilavariable.

FLUSHn'ad'utilitquepourlesvariablesvisiblesdesautresthreads. Siaucunevariablen'estspcifie,touteslesvariablevisiblessontmisesjour. La directive FLUSH est implicitement appele par les directives suivantes: BARRIER, CRITICAL, END CRITICAL, END DO , END SECTIONS , END SINGLE, END WORKSHARE, ORDERED, END ORDERED,PARALLEL et ENDPARALLEL. On a rarement besoin d'utiliser FLUSH directement. Il est plus simple (et plus lent)d'utiliserBARRIER.

BenoitSemelin2005

viterlesconflits: directivesATOMICetCRITICAL
Commentviterque2threadstententdechangerenmmetempsla mmevariable. DirectiveATOMIC:
La ligne de code qui suit la directive ATOMIC et qui modifie une variable X, est excute atomiquement,c'estdirejamaissimultanmentpas deux threads. (Voir rfrence OpenMP pour la formedelalignedecodeconcerne). ATOMICpeuttreplusperformantqueCRITICAL.
!$OMPPARALLELPRIVATE(XLOCAL) !$OMPDO doI=1,N callcompute(xlocal(i),i) !$OMPATOMIC xglobal=xglobal+xlocal(i) enddo !$OMPENDDO !$OMPENDPARALLEL !$OMPPARALLELPRIVATE(XLOC,YLOC)

DirectiveCRITICAL:
Mme fonction que ATOMIC, mais concerne une zone de code. Un seul thread peu accder cette zone simultanment La zone se termine par END CRITICAL. Si on a plusieurs zones CRITICAL, il fautlesnommerpourlesrendreindpendante.

callcompute_xloc() callcompute_yloc() !$OMPCRITICAL(ZONE1) xglob=xglob+xloc yglob=yglob+yloc !$OMPENDCRITICAL(ZONE1) !$OMPENDPARALLEL

BenoitSemelin2005

Dansl'ordre: directiveORDERED
!$OMPPARALLELPRIVATE(XLOCAL) !$OMPDOORDEREDSCHEDULE(DYNAMIC) doI=1,N callcompute(xlocal(i),i) !$OMPORDERED write(*,*)i,xlocal(i) !$OMPENDORDERED enddo !$OMPENDDO !$OMPENDPARALLEL

La directive ORDERED permet, l'intrieur d'une boucle paralllise, d'excuter une zone squentiellement, c'est dire thread par thread, dans l'ordredesindicescroissant.
Cela permet de faire une entresortie ordonnedansunezoneparallle. C'estunoutildedbugage.Celapermetde vrifier l'indpendance des itrations d'une boucle. Si la zone ORDERED reprsente une fraction du temps de calcul d'une itration, suprieure 1./OMP_NUM_THREAD, cela ralentitl'excution.

BenoitSemelin2005

OpenMP: variablesd'environnement etbibliothquestandard

BenoitSemelin2005

Variablesd'environnement
Ilexiste4variablesdfinissentl'environnementOpenMP:

OMP_DYNAMIC: boolen. Permet l'ajustement dynamique du nombre de threads.SiTRUE,l'utilisateurdclarelenombremaximaldethread,etlesystme endonneunnombreinfrieurougal,enfonctiondesdisponibilits. OMP_NUM_THREADS:entier.Fixelenombre(maximal)dethreads. OMP_NESTED:boolen.Permetd'imbriqulesrgionsparallleslesunedansles autres: chaque threads peut se subdiviser. Dlicat utiliser. Inutile pour le calcul scientifique? OMP_SCHEDULE:chanedecaractres.Spcifielastratgiededistributiondes itrationsdeladirectiveDOassocielaclauseRUNTIME.

Exemples: exportOMP_DYNAMICTRUE exportOMP_NUM_THREADS8(souventindispensable) exportOMP_NESTEDFALSE exportOMP_SCHEDULE''GUIDED4'' Lesvaleursdesvariablespeuventtremodifiespendantl'excutionpardesfonctionsdela bibliothquestandard.

BenoitSemelin2005

Bibliothquestandard: contrledel'environnement

Onpeutsouventsepassercompltementdecesfonctions. Modlesd'excution:(appeldepuisunezonesquentielle)

OMP_SET_DYNAMIC(boolean): Subroutine. Active/dsactive l'ajustement dynamiquedunombredethread:fixeOMP_DYNAMIC. OMP_GET_DYNAMIC():Function.RetournelavaleuractuelledeOMP_DYNAMIC. OMP_SET_NESTED(boolean):Subroutine.FixeOMP_NESTED OMP_GET_NESTED():Function.RetournelavaleuractuelledeOMP_NESTED.

Contrledunbdethread/processeur:

OMP_SET_NUM_THREADS(entier): Subroutine. Fixe le nombre de thread (maximum) pour les prochaines zones parallle (valeur de OMP_NUM_THREADS). Appeldepuisunezonesquentielle. OMP_GET_NUM_THREADS(): Function. Retourne le nb rel de threads utilis l'instantt. OMP_GET_MAX_THREADS(): Function. Retourne la valeur de OMP_NUM_THREADS(nbmaximaldethreads). OMP_GET_NUM_PROCS():Function.Retournelenombredeprocesseursutiliss.

BenoitSemelin2005

Bibliothquestandard: contrlemanueldelaparalllisation
Excutionconditionnelle/partagedestchesmanuel:

OMP_IN_PARALLEL(): Boolean function. Dtermine si on est dans une rgion parallle. La directive PARALLEL peut comporter une clause de condition (cf spcificationsOpenMP).Utiledanscecas/ OMP_GET_THREAD_NUM(): Fonction entire. Retourne le numro du thread. Permet,parexemple,defairelepartagedutravail''lamain'',sansutiliserdedirective OpenMP(MasochistesurunearchitectureSMP).

Utilisationdeverrous:
Unverrouestlibreoupossdparunthread.UnesriedefonctionOpenMPpermet delesmanipuler,parexempled'attendre unpointducodequeleverrousoitlibr parunautrethread.

Permet des comportements similaires la directive CRITICAL, mais avecuncontrleplusfin.VoirspcificationsOpenMP.

BenoitSemelin2005

Paralllisationsurarchitectures mmoiredistribue: dcompositionendomaines

BenoitSemelin2005

Dcompositionen domaine/fonction
Schmabasiqued'unordinateur:
Uneunitdecalculopresurdes donnesquellelitetcritmmoire.
x,y

CPU z=x+y

Mmoire

SionaNCPUetNmmoires,ilfaut:

Rpartirlescalculs:
Chaque unit de calcul va assurer un type de calcul diffrent sur l'ensemble des donnes.C'estleprincipededcompositionparfonction.

Rpartirlesdonnes:
Touteslesunitsdecalculeffectuentlesmmescalculssurlapartiededonnesqui leurestattribue.Ilaccsauxdonnesdesautresunitsdecalculsefaitpar chage demessages.C'estleprincipededcompositionendomaines.

La sparation est arbitraire, en gnral on combine les deux. Mais, pour le calcul scientifique, c'est la dcomposition en domaines qui

BenoitSemelin2005

Dcompositionendomaine: stratgie.
Lescontraintes:
Les communications (change de donnesentre domaines) ontuncotentemps CPU:ilfautminimiserlaquantitdecommunication(nombreettaille). Il faut que chaque domaine reprsente la mme quantit de travail. Il faut minimiser les fluctuations de charge et assurer l'quilibrage dynamique des charges.

Unedcompositionidale:
Aucunbesoindecommunicationentredomaines. Domainesstatiques:chargeconstante,quilibr.

Cen'estpasduparalllisme! Unedcompositionsatisfaisante:
Tempsdecommunication<<tempsdecalcul.

BenoitSemelin2005

Dcomposabilit
La possibilit/efficacit d'une dcomposition en domaines dpend du problmealgorithme.Exemples: Pbalgonondcomposable(nonparalllisable...):
Intgrationd'uneODEparmthodeEuler,RungeKutta... Dynamiqueunsystmetroiscorps(cfODE).

Pbalgodcompositiondlicateouinefficace:
Dynamiqued'unsystmeNcorps. Rsolution d'une EPD sur grille adaptative et pas de temps adaptatif (quilibage). Rseauderactionschimiques(vitessesderaction).

Pbalgodcompositionsimpleetefficace:
Rsolutiond'uneEDPsurgrillenonadaptative.

BenoitSemelin2005

Exemplededcomposition2: rsolutiond'EDPsurgrille.
v v 1 v v = t x R e x2
2

Rsolutiondel'quationdeBurger:

Onrsoutl'quationsurunegrille1D,parunemthodedediffrencesfinies,etavec unschmaexplicite(!)pasdetempsconstant.
Tailledecelluleconstante: domainesstatiques Grille adaptative : domainesdynamique. Le domaine 2 se restreint spatialement mais conserve autant decelluleque1et3.

BenoitSemelin2005

Exemplededcomposition2: L'algorithmeTreecode.

Dynamique d'un systme N corps:


Calcul des forces en N ln(N), par utilisation du dveloppement multipolaire. Contrle de la prcision par , l'angle d'ouverture. C'est un algorithmeditenarbre. Consquencespourlaparalllisation: Moins d'interactions distantes. entre zones

=> Des domaines ''compacts'' dans l'espace (x,y,z) minimisent les communications.

BenoitSemelin2005

AlgorithmeTreecode: exemplededcomposition.

Mthodepardichotomie. Simpleetefficace. Gadget(codepublique)

Dcompositiondel'arbre. Pourlesalgoocttree.

TesselationVorono. Communicationsmimales. Constructiondesdomaines coteuse.

Plusieurssolutionspossibles.Cadpenddesdtailsde l'implmentationdel'algorithmecommun.

BenoitSemelin2005

Paralllisationsurarchitectures mmoiredistribue: communications.

BenoitSemelin2005

Tempsdetransmission d'unmessage.

Surunearchitecture mmoiredistribue,lesunitsdecalculsdoivent changerdesmessages.Cescommunicationsnesontpasinstantane. Le cot dpend du rseau de communiations et de l'implmentation MPI. D tails des contributions au
cotdecommunication.voir graphique. Consquences: Il vaut mieux envoyer 1 gros message que plein de petits. Il faut grouper les communication!

BenoitSemelin2005

Modesdecommunications entreprocess.
Exempledemcanismedecommunication:(twosided,buffered,synchrone)
Lecture Ecriture

RAM

Ecriture Bufferde rception Buffer d'envoi

''Prtenvoyer'' ''Prtrecevoir'' Transmissionde donnes

Lecture Bufferde rception Buffer d'envoi

Modedecommnications:dfinitions Onesided/Twosided:
Unseulprocesseurgretoutleslmentsdelacom/lesdeuxprocesseursintervienent, ilgrechacununepartiedeslmentsdelacom.

Synchrone/Asynchrone:
Leprocesseurquienvoit(1) attend/n'attendpasque le proccesseur quirecoit(2)ait signalqu'il taitprt.Enmodeasynchrone,leprocesseur(1)transmetlesdonnesqui sont critesdanslebufferderceptionduprocesseur(2).Ilviendraleslireplustard, quandlecodeluidiradefaire.

RAM

CPU1

CPU1

BenotSemelin2005

Communicationglobales: lescontraintesmatrielles

Dansunordinateurmultiprocesseur,chaqueprocesseurn'apasunlienavectoutles autrespourlescommunications(tropcher).Ilfautpourtanttenterdel'optimiser. Deuxcritresdeperformancepourunrseaudenprocesseurs: Nombredeliensmoyenpourjoindre2processeursnl ''Bandepassantedebissection''Bb(bandepassanteentre2moitisdurseau)

Ligne:nL~n/3,Bb=1

Anneau:nL~n/4,Bb=2 Grille:nL~ n,Bb= n Tore:nL~ n/2,Bb=2 n

HypercubedimD:nL~D,Bb=n/2

Arbrehirarchique:nL~log(n),Bb=n/2...?

BenoitSemelin2005

Communicationsglobales surl'hypercube
Uneimplmentationnavedelarductiond'unevariable(sommedesvaleurs surlesNprocesseurs)ncessiteNcommunicationssuccssives:
CPU8 X8 CPU7 X7 CPU6 X6 CPU5 X5 CPU4 X4
X1+X2+X3 X1+X2 X1

CPU3 X3

CPU2 X2

CPU1 X1

Une implmentation de la rduction en utilisant le principe de l'hypercube ncessite log(N) communicationssuccssives.


Le principe de l'hypercube peut servir pour organiser des communications globales type REDUCTION dans un code. MPI s'en sert pour ses fonctions de communications globales gnriques. Si ces routines gnriques ne rpondent pas aux besoins de l'utilisation, il peut utiliser le principe de l'hypercubeluimme.

CPU7 X7

CPU8 X8

CPU4 X4
2

CPU3 X3 CPU5 X5
3 2

CPU6 X6

CPU1 X1

CPU2 X2

BenoitSemelin2005

Performancesd'un codeparallle.
Cotdescommunications:
Siletempsdecommunications=10%dutempsdecalcul,inutiled'utiliser plusde510processeurs.Ilfautminimiserletempsdecommunication. Pistespourrduirelescommunications: Recouvrementdesbordsdedomaines(Simulationsurgrille) Duplicationdesdonnescritiques(Treecode)

Equilibragedecharge:
Siunprocesseurest1,3foispluslentqu'unautre,onobtientlemmetemps decalculqu'avec0.7foismoinsdeprocesseurs. Equilibragedynamiquedescharges(''overloaddiffusion''): Applicable,parex,quandoncalculeunevolutiontemporelle. ChaquedomaineaunetailleSi(t)variable.Achaquepasdetemps,on calculeTi(t),letempsdecalculsurchaqueprocesseur. OnadapteS ,parexemple:S (t+dt)=S (t)*T (t)/T (t)(stabilit?)

BenoitSemelin2005

MPI

BenoitSemelin2005

Introduction
MPIestunebibliothquedecommunicationpourleparalllismesur architecturesmmoirepartage(Fortran,C,C++).
LesstandardsMPI: MPI1(1994):Lecoeurdelabibliothque
Communicateurs Communicationslocalesetglobale Dfinitiondetypedevariable Topologies

MPI2(1997):extensionsetsupportC++etf90
Communications''onesided'' Entressortiesparallles(nontraitesici)

Implmentationsgratuites: LAM:http://www.lammpi.org
MPI1et2(enpartie)surgrilledePCouarchitecturesSMP.

MPICH2:http://wwwunix.mcs.anl.gov/mpi/mpich2/index.htm
MPI1et2(enpartie)surgrilledePCouarchitecturesSMP.

BenoitSemelin2005

MPI: fonctionsgnrales, environnement

BenoitSemelin2005

Environnementsystme
Ilfautinclurelabibliothque MPI. mpif.henfortran. mpi.henC/C++.
programEX_0 implicitnone include''mpif.h''!(ouUSEMPIavantimplicitnone) integer::nb_procs,rang,err callMPI_INIT(err) callMPI_COMM_SIZE(MPI_COMM_WORLD,nb_procs,err) callMPI_COMM_RANK(MPI_COMM_WORLD,rang,err) print*,'Jesuisleprocessus',rang,'parmi',nb_procs callMPI_FINALIZE(err) endprogramEX_0

Exemplesdecommandes decompilation:
SurMPOPM:

source/usr/opt/HPMPI200/bin/use_hp_mpi mpif90EX_0.f90(oumpif77,mpicc,mpiCC) mpirunnp8EX_0.out

Surzelkova:(ouquadrioptronSIO,ougrillePCLAM)
setenvPATH/usr/local/lammpi/bin:${PATH} mpif77EX_0.f(oumpiccoumpic++,attentionpasdef90!)

BenoitSemelin2005

Initialisationetsortie
Avec MPI, on dfinit une seule zone parallle dans le programme, souvant l'ensemble ducode. Lespartiesducodeavantetaprs la zone parallle sont locale sur chaque processeur. Pas de communicationspossibles. Dbutdezoneparallle Enfortran:callMPI_INIT(err) EnC:MPI_Init(); EnC++:MPI::Init();
Fonctioncollective!(appelepartouslesprocess)

programEX_0 implicitnone include''mpif.h''!(ouUSEMPIavantimplicitnone) integer::nb_procs,rang,err callMPI_INIT(err) callMPI_COMM_SIZE(MPI_COMM_WORLD,nb_procs,err) callMPI_COMM_RANK(MPI_COMM_WORLD,rang,err) print*,'Jesuisleprocessus',rang,'parmi',nb_procs callMPI_FINALIZE(err) endprogramEX_0

Findezoneparallle Enfortran:callMPI_FINALIZE(err) EnC:MPI_Finalize(); EnC++:MPI::Finalize();


Fonctioncollective!(appelepartouslesprocess)

Pourunedfinitionprcisedesfonctions(type,argoptionnels,etc...)voiraide mmoireIDRISetmanuelderfrenceMPIenligne.

BenoitSemelin2005

Goupesetcommunicateurs: objetsdebasedeMPI
Groupe:Ensembledeprocess.
0 2 1 3

Groupes et communicateurs sont des objets MPI opaques: on les manipuleparune''poigne''(variabledetypeINTEGERenfortran)

Intracommunicateur: Struture d'change de messages entre process contenantungroupeunique.


0 2 1 3

Intercommunicateur: Struture d'change de messages entre process contenant 1 0 2 1 0 1 deuxgroupes.


3 2 4 3 2 3

BenoitSemelin200

Manipulationdes groupesetcommunicateur.

L'appel MPI_INIT() dfinit un communicateur par dfaut: MPI_COMM_WORLD (constanteentireMPI) Souvant, MPI_COMM_WORLD est le seul usage des communicateurs/groupes que fait un code.Maisilestparfoisintressantdecrerdessousgroupes/souscommunicateur. Quelquesfonctionspourcrermanipulerdtruirelesgroupesetcommunicateur. MPI_COMM_SIZE(comm,size,err):locale.Renvoiesize,lenbdeprocessdanscomm. MPI_COMM_RANK(comm,rank,err):locale.Renvoierank,lenduprocessappelant. MPI_COMM_GROUP(comm,group,err): locale! Cre un groupe group avec tout les processdecomm. MPI_GROUP_INCL(group,n,rank_array,subgroup,err): locale. Cre un groupe subgroup,avecunslectiondenprocessdegroupdfinieparrank_array. MPI_COMM_CREATE(comm,subgroup,subcomm,err): collective. Cre l'intra communicateursubcommdesubgroup, MPI_GROUP_SIZE(group,size,err):locale.Renvoiesize,lenbdeprocessdansgroup. MPI_GROUP_RANK(group,rank,err):locale.Renvoierank,lenduprocessappelant.

BenoitSemelin200

MPI: communicationspointpoint

BenoitSemelin200

Structured'unmessageMPI
Parl'intermdaired'unmessage,unprocesspeutenvoyerdesdonnes unautre. Enplusdesdonnes,lemessagecontientune''enveloppe''quicontient plusieurschamps: Source:rangduprocessquienvoie. Destination:rangduprocessquireoit Etiquette:entierquiidentifielemessagedemanireunique. Communicateur:communicateurauseinduquelsefait l'change. Lesfonctionsd'envoietdereceptiondcriventdemanirenon

BenoitSemelin200

MPI_SENDetMPI_RECV: communicationdebase.
programEX_1!(progde2process) implicitnone include''mpif.h'' integer::rang,err,tag1,tag2 integer,dimension(MPI_STATUS_SIZE)::statut real,DIMENSION(10)::x,x_remote
Dbut dutableaud'envoi (adresse) Nombre devariables envoyer TypeMPI desvariables envoyer Numro duprocess destinataire.

callMPI_INIT(err) tag1=1 tag2=2 callMPI_COMM_RANK(MPI_COMM_WORLD,rang,err) x=rand() if(rang==0)then callMPI_SEND(x,10,MPI_REAL,1,tag1,MPI_COMM_WORLD,err) callMPI_RECV(x_remote,10,MPI_REAL,1,tag2,MPI_COMM_WORLD,statut,err) endif if(rang==1)then callMPI_SEND(x,10,MPI_REAL,0,tag2,MPI_COMM_WOLD,err) callMPI_RECV(x_remote,10,MPI_REAL,0,tag1,MPI_COMM_WORLD,statut,err) Numro duprocess endif
source

Etiquette dumessage

Communicateur

Statutde l'oprationde rception.

print*,'rang:',rang,'liste:',x,x_remote

BenoitSemelin200

MPI_SENDetMPI_RECV: dtailsd'utilisation.
Pourdesraisonsdeportabilit(grillehtrogne),ilfautdonnerun''typeMPI'' pourlesvariablesenvoyes.VoicilacorrespondancepourFortran:
INTEGER:MPI_INTEGER(MPI_INTenC) REAL:MPI_REAL(MPI_FLOATenC) DOUBLEPRECISION:MPI_DOUBLE_PRECISION(MPI_DOUBLEenC) LOGICAL:MPI_LOGICAL CHARACTER(1):MPI_CHARACTER(MPI_CHARenC)

OnpeutaussienvoyerdestypesMPI_PACKEDetdestypesdfinisparl'utilisateur (structures). Latailledutableau(buffer)dereceptiondoittrelatailledumessage. Wildcards: MPI_RECV accepte MPI_ANY_SOURCE et MPI_ANY_TAG (constantesmpi)commevaleurpourlasourceetl'tiquettedumessage. Lavariable''statut''contient(enFortran): statut(MPI_SOURCE):sourcedumessagereu. statut(MPI_TAG):l'tiquettedumessagereu.

BenoitSemelin200

Modesdecommunication: dfinitions
Communicationbloquante: l'appel lafonctionne''retourne'' quequandlesressourcesutilises
(p.e.emplacementmmoiredelavariableenvoye)peuventtrerutilisesetquelafonction''complte''.

Communicationnonbloquante: l'appel lafonction retourne avantquelesressourcesaient t


libres, et le programme continue. Il faut s'assurer qu'on ne modifie pas les ressources avant que la communicationsoiteffectivementcomplte.Lafonctionnecomplteiqu'cemomentl.

Mode d'envoi ''buffered'': le message est stok dans une mmoire systme locale avant d'tre
envoy.Lafonctiond'envoi(bloquanteounon)compltequandlacopieestfiniemaisavantl'envoi.

Moded'envoi''synchrone'': l'envoieffectifdumessagenecommencequequandleprocessreoit
lemessageprtd'unecommandederceptioncorrespondante.Lafonctiond'envoine complte qu'ce momentl.

Mode d'envoi ''ready'': le process metteur suppose que le recepteur est prs recevoir sans
vrifier, et envoie le message (meilleures performances). Si lercepteur n'a pas excut lacommande de rceptioncorrecpondante>Erreur!Lafonctioncompltequandl'evoiestfini.

Mode d'envoi ''standard'': Suivant la disponibilit en mmoire systme, MPI choisit lui mme
entrelesmodes''buffered''et''synchrone''.

Iln'yaqu'unmodedereception.

BenoitSemelin200

Autresfonctionsde communicationpointpoint
Ilexisteunepanopliedefonctionspoureffectuerdescommunications bloquanteounondanslediffrentmode.Elles'utilisentaveclesmme arguementsqueMPI_SENDetMPI_RECV,plusunargument''request'' pourlesfonctionsnonbloquantes.
BloquantNon-bloquant StandardMPI_SEND MPI_ISEND Synchrone MPI_SSEND MPI_ISSEND Ready MPI_RSEND MPI_IRSEND
(ncessiteMPI_BUFFER_ATTACH)

BufferedMPI_BSEND MPI_IBSEND Reception M PI_RECV MPI_IRECV

Lemodebufferedncessiteunecopiemmoiredeplusmaispermetdecontinuerlescalculscoupsr. Lemodereadydiminuelalatence,maisestdlicatutiliser(synchronisation).

BenoitSemelin200

Grerlacompltion d'uneoprationnonbloquante.
Syntaxed'unenvoinonbloquant: MPI_ISEND(val,count,datatype,dest,etiquette,comm,requete,err) Lecodepeutcontinuermaisgardelatracedel'envoigrce requete (poignevers un objet MPI). Il peut utiliser requete ultrieurement pour contrler si la communicationestcomplte:
MPI_WAIT(requete,statut,err): attentant que la communication associe requete soit complte.statutcontientdesinfossurlacommunication. MPI_TEST(requete,flag,statut,err): flag=true si la communication associe requete est complte.Sinon,flag=false,etrequeteestdsalloue!Pasdevrificationultrieurepossible. MPI_REQUEST_GET_STATUS(request,flag,status,err): teste la compltion sans dsallouerlarequte,mmesiflag=true. MPI_REQUEST_FREE(request,err):dsallouelarequte.

Il est possible de grer des compltions mulitples grce MPI_WAITANY, MPI_WAITALL,MPI_WAITSOMEetlesquivalentpourTEST. Attention: MPI_REQUEST_FREE n'anulle pas la communication non bloquante.

BenoitSemelin200

Communications nonprdictibles
Danscertainsalgorithmes,lebesoindecommunicationspeutdpendre desdonnesinitiales(ex:modifdynamiquedesdomaines): Lesbesoinsdel'envoisontdterminslocalementparlecalcul. Commentdterminerlesrceptionseffectuer? Onpeuttesterpriodiquementl'arrivedemessagessanslesrecevoir. MPI_IPROBE(source,etiquette,comm,flag,status):nonbloquant! flag dtermine si un message est arriv ou non. source et etiquette peuventprendrelesvaleursMPI_ANY_SOURCEetMPI_ANY_TAG, siflag=true,statuscontientlasourceetl'tiquette. Etsionneconnaitpaslalongueurdumessage?
L'tiquettepeutservircoderlenombreetletypededonne. Uneprcommunication unformatstandardispeutannoncerl'tiquette,letypeet lenombrededonnesd'unmessagevenir.

BenoitSemelin200

Synchronisation
Synchronisationglobale: MPI_BARRIER(comm,ierr):fonctioncollective Permetdebloquerlesprocessducommunicateur commjusqu`ceque lederniersoitarrivlabarrire. Synchronisationlocale: On peut utiliser une communication synchrone bloquante (MPI_SSEND/RECV)poursynchroniser2process. Si on a besoin de synchroniser de faon rpte un sousgroupe de process, il faut sansdoute dfinir un nouveau sousgroupeMPI et un

BenoitSemelin200

MPI: communicationsglobales (fonctionscollectives)

BenoitSemelin200

Communicationde type''broadcast''
CPU1
X0

Il s'agit de diffuser aux autres processeurs une valeur connue sur unseul: MPI_BCAST(address,count,datatype,root,comm,err) root dsignelerangduprocessqui diffuse l'information. Les autres arguments ont la mme significationquedansMPI_SEND. C'est une fonction collective : elle doit tre appele par tous les process. Il faut privilgier les communications collectives pour la simplicitdelaprogrammation.

CPU0
X0

CPU2
X
0

CPU3
X0

BenoitSemelin200

Communicationde type''gather''

Ils'agitderassemblersurl'undesprocess des donnes rparties sur l'emsemble des processducommunicateur: MPI_GATHER(s_add,s_count,s_type,r_add,r_count,r_type,root,comm,err) root dsigne le rang du process qui reoit les donnes. r_add dsigne l'adresse (nom de variable en fortran) o lesdonnesreuessontstockes. Lesdonnessontstockesdansl'ordrede rangdesprocesseursquienvoient. r_countestlenombredevariablesde typer_typereuedechaqueprocess. Donc,laplupartdutemps: s_count=r_count=constante! Sur le process root, s_add peut tre remplac par MPI_IN_PLACE. On suppose alors que les donnes envoyer pourleprocessrootsontdjleurplace

CPU1
X1

CPU 0

X0 X1

CPU2
X2

X2 X3

CPU3
X3

BenoitSemelin200

Autrescommunicationsde type''gather''
MPI_GATHERV(s_add,s_count,s_type,r_add,r_counts,disp,r_type,root,comm,err)

Pourrecevoirune quantit dedonnes diffrente dechaqueprocessoulesdisposerde manirenonconscutivedansletableauderception,onutiliselaversionvecteur:

s_countpeutmaitenanttrediffrentsurchaqueprocess. r_countsestuntableaudeNB_PROCSentiers. r_counts(i)doitavoirlavaleurder_countsurleprocessi. dispestuntableaudeNB_PROCSentiers. Lesdonnesreuesduprocessisontstockel'adresse:r_add+disp(i)*sizeof(r_type)

Pourraliseruneoprationsurlesdonnesreues,onutiliseunefonctionderduction:
MPI_REDUCE(s_add,r_add,count,datatype,op,root,comm,err)

Lesvaleursdanss_addsurlesdiffrentsprocesssontcombines,lmentlmentsicount1, etstockesdansr_addsurleprocessroot.Lacombinaisonestfaiteparl'oprateurop. Enfortranoppeutprendrecommevaleurs:MPI_SUM,MPI_PROD,MPI_MAX,MPI_MIN,etc...

BenoitSemelin200

Communicationsde type''scatter''

Il s'agit de rpartir sur les process du communicateur des donnes prsentessurl'undesprocess: MPI_SCATTER(s_add,s_count,s_type,r_add,r_count,r_type,root,comm,err) rootdsignelerangduprocessqui envoie les donnes. s_add dsigne l'adresse (nom de variable en fortran) o les donnes envoyer sontstockes. Les donnes sont envoyes par paquet de s_count aux process du communicateurparordrederang. Engnralr_count=s_count. Ilexisteunevariante''vecteur'': MPI_SCATTERV Ilexisteaussi: MPI_REDUCE_SCATTER Opre une reduction sur des

CPU1
X1

X0 X1 X2 X3

CPU0

CPU2
X2

CPU3
X3

BenoitSemelin200

Communicationsde type''allgather''

Mme fonction que MPI_GATHER, maischaqueprocessreoitlersultat: MPI_ALLGATHER(s_add,s_count,s_type,r_add,r_count,r_type,comm,err) Pasderoot! Autres arguments identiques MPI_GATHER. Equivalent NB_PROCS appels MPI_GATHERavec chaquefoisun processdiffrentcommeroot.

CPU1
X0 X1 X2X3

CPU0

MPI_ALLGATHERV Etuneversionavecrduction: MPI_ALLREDUCE

X1 X2 X3 X0 X1 X2X3

X3

CPU3

CPU2

Ilexisteuneversionvecteur:

X0

X0 X1 X2

BenoitSemelin200

Communicationsde type''alltoall''
MPI_ALLTOALL(s_add,s_count,s_type, r_add,r_count,r_type,comm,err)

Mme

fonction que MPI_ALLGATHER, mais chaque process reoit des donnes diffrentes:

CPU1
W1 X1 Y1 Z1 X0 X1 X2 X3

Arguments

identiques

MPI_ALLGATHER.

CPU0

Ilexistedeuxversionsvecteurs, pour pouvoir faire varier le nombre,letypeetlapositiondes donnesenvoyesetreues: MPI_ALLTOALLV MPI_ALLTOALLW Avec MPI_ALLTOALLW on peuttoutfaire!Oupresque...

X0 W1 Y0 W2 Z0 W3 Z0 Z1 Z2 Z3 W3 X3 Y3 Z3

Y2 Y2 Y3 Z2

CPU3

CPU2

Mais ici s_add et r_add dsignent des tableaux de mme taille.

W0W

Y0W2 Y X2

BenoitSemelin200

Typesdrivs: variablesMPI dfiniesparl'utilisateur

BenoitSemelin200

Dclareruntypedriv
LesfonctionsdecommunicationMPIutilisecommeargumentdestypesMPIstandard comme MPI_INTEGER ou MPI_REAL. Il est possible de dfinir des types plus complexes.Celapeutservir,parexemple: Aenvoyerunesectiondetableau. Aenvoyerunevariabledetypestructuredfiniedansleprogramme. Exemplededclarationd'untypedrivsimple:
INTEGER::err,MPI_vector callMPI_TYPE_CONTIGUOUS(3,MPI_REAL,MPI_vector,err) callMPI_TYPE_COMMIT(MPI_vector,err) ...communications... callMPI_TYPE_FREE(MPI_vector,err)

On dfinit ici un type MPI_vector, constitu de 3 MPI_REAL stocks conscutivementenmmoire.MPI_vectorpeutservirdfinird'autrestypesdrivs. Ilfaut''compiler''letypeavec MPI_TYPE_COMMIT avantdepouvoirl'utiliserdans unecommunication.

BenoitSemelin200

Transmettreunesectionde tableau

Lessectionsdetableauxsontunoutilspuissantdefortran.Onpeutdfinirdestypesdrivspour
envoyerdessectionsdetableau.Exemple:

Les lmentsfoncsconstituentlasectionx(2:12:3)dutableaux(1:12).DfinissonsuntypeMPI correspondant.


INTEGER::err,MPI_vector_section REAL,DIMENSION(12)::x,y

callMPI_TYPE_VECTOR(4,1,3,MPI_REAL,MPI_vector_section,err) callMPI_TYPE_COMMIT(MPI_vector_section,err) callMPI_ALLREDUCE(x(2),y(2),1,MPI_vector_section,MPI_SUM,MPI_COMM_WORLD,err)

MPI_TYPE_VECTORconstruitletypeMPI_vector_section,constitude4blocsde1MPI_REAL,avecun pasentrelesdbutsdeblocsde3MPI_REAL.4,1et3peuventvariervolont. Attention:lestableauxmultidimensionnelsontstocksenmmoiresousformedevecteur1D.Ilfautsavoir quelestl'indicequivarieleplusvite.Onpeutalorsdfinirdestypessectionsrecursivementsurlesdimensions.

BenoitSemelin200

TypedrivMPI correspondantunestruture

integer::err,MPI_integer_length,MPI_real_length,MPI_logical_length integer::MPI_vector_length,MPI_vector,MPI_particle integer,dimension(10)::array_of_block_length,array_of_types,array_of_displacement callMPI_TYPE_EXTENT(MPI_INTEGER,MPI_integer_length,err) callMPI_TYPE_EXTENT(MPI_REAL,MPI_real_length,err)Pourlaportabilit callMPI_TYPE_EXTENT(MPI_LOGICAL,MPI_logical_length,err)(mesuredetaillemmoireenbits) callMPI_TYPE_CONTIGUOUS(3,MPI_REAL,MPI_vector,err) callMPI_TYPE_COMMIT(MPI_vector,err)Dfinitiond'untypevecteur callMPI_TYPE_EXTENT(MPI_vector,MPI_vector_length,err) array_of_block_length(1:3)=(/1,2,1/) array_of_types(1:3)=(/MPI_INTEGER,MPI_vector,MPI_REAL/) array_of_displacement(1)=0Descriptiondu array_of_displacement(2)=MPI_integer_lengthtypestructure array_of_displacement(3)=array_of_displacement(2)+2*MPI_vector_length(dplacementsenbits) callMPI_TYPE_STRUCT(3,array_of_block_length(1:3),array_of_displacement(1:3)& &,array_of_types(1:3),MPI_particle,err)Dclaration call MPI_TYPE_COMMIT (MPI_particle,err) dutype Pasdemoyended finirdestypesobjetsdansMPIdebase!

} }

BenoitSemelin200

MPI: communications''onesided''

BenotSemelin200

Introduction
Quefairequandleprocessreceveurnesaitpasqu'ildoitrecevoir? Lancer rgulirement Performances? de communications globales.

Utiliser MPI_IPROBEet descommunicationsnonbloquantes... synchronisationdlicate. Utiliserdescommunications''onesided''.

Lescommunicationsonesided,permettentd'utiliserlecaractreSMP d'une architecture pour amliorer les performances, mais ne constituentpasunmodlecompletdeprogrammationSMP.

BenoitSemelin200

Dclarerunefentre decommunicationonesided.
Ilfautdfinirunezonemmoireaccessibleparlesprocessdistantslors decommunicationsonesided: MPI_WIN_CREATE(add,size,disp_unit,info,comm,win,err)

add:addressededbutdelafentre(ex,nomdetableau). size:tailledelafentreenbit. disp_unit:unitdedplacementpourlesaccsultrieurs. info:poigneversuntableauoles3premiersserontstocks. comm:communicateur win:poigne(entier)attachelafentrecre. err:coded'erreur

MPI_WIN_CREATE est une fonction collective. La fentre n'a pas forcementlammetailleetpositionsurtouslesprocess.

BenoitSemelin200

MPI_PUT/MPI_GET: criture/lecture
Ilya2fonctionsprincipalespourraliserunecommunicationone sided:
MPI_PUT(loc_add,loc_count,loc_type,remote_rank,remote_disp& &,remote_count,remote_type,win,err) MPI_GET(loc_add,loc_count,loc_type,remote_rank,remote_disp& &,remote_count,remote_type,win,err)

loc_add:adressededbutdesdonnessurleprocessquiappellelafonction remote_disp:Dfinitl'endroitolire/crirelesdonnesparledplacementen disp_unitparrapportaudbutdelafentresurleprocesscible. loc_count,remote_count:Nombresdevariableslire/crire. loc_type,remote_type:Typedesvariableslire/crire. remote_rank:Numroduprocesscible. win:fentredanslaquellesefaitlacommunication.

BenoitSemelin200

Compltiondescommunications onesided.
CALLMPI_WIN_CREATE(x,1000,MPI_real_length,info,MY_COMM_WORLD,x_win,err) CALLMPI_WIN_FENCE(MPI_MODE_NOPRECEDE,x_win,err) target=mod(rank+1,nb_proc) index_to_put=local_computation() CALLMPI_PUT(x(index_to_put),1,MPI_REAL,target,index_to_put,1,MPI_REAL,x_win,err) CALLMPI_WIN_FENCE(MPI_MODE_NOSUCCEED,x_win,err) CALLMPI_WIN_FREE(x_win,err)

MPI_WIN_FENCE estune fonctioncollective.Elleagitcommeunebarrire, aucun process dugroupenecontinuetantquetouteslescommunicationsdelafentrenesontpascompltes. Lepremierargumentsertl'optimisation,ilpeuttoujoursvaloir0.Ilpeutprendrelesvaleurs:


MPI_MODE_NOSTORE: pas d'criture en local dans la fentre depuis le dernier FENCE. MPI_MODE_NOPUT:PasdePUTverslafentrelocaled'icileprochainFENCE. MPI_MODE_NOPRECEDE:Pasdecommunicationsantrieurescomplter. MPI_MODE_NOSUCCED:Pasdecommunicationsultrieures.

Onpeutcombinercesvaleurs(voirmanuelderference).Lesoptimisationscorrespondantesne sontparfoispasimplmentes.

BenoitSemelin200

Cequejen'aipastrait:
Topologiedeprocess Entrssortiesparallles Intercommunications Crationdynamiquedeprocess Packingdedonnes