Documente Academic
Documente Profesional
Documente Cultură
MthodologieM2
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:
BenoitSemelin2005
Modlesdeparalllisme
Architecturematrielle:
SISD
Single Instruction SingleData
SIMD
SingleInstruction MultipleData
MIMD
MultipleInstruction MultipleData
PC monoprocesseur
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
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
SIO
~ 0.3 Tflops
Evolution
BenoitSemelin2005
Outilsdeparalllisation
Laparalllisationpeuttreeffectuesdiversniveaux: Langages:
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)
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
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. X1=? ... ... ... ... ... ... X=2. ... X1=2.53
X=1. X2=? ... ... ... ... X=X+1. ... ... X2=124.
X=1. X3=? ... ... ... ... ... ... ... ... X=2. X =2. 3
X=2.
X=2. X=?
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
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.
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
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.
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
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:
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.
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
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.
BenoitSemelin2005
Bibliothquestandard: contrledel'environnement
Onpeutsouventsepassercompltementdecesfonctions. Modlesd'excution:(appeldepuisunezonesquentielle)
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.
BenoitSemelin2005
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.
=> Des domaines ''compacts'' dans l'espace (x,y,z) minimisent les communications.
BenoitSemelin2005
AlgorithmeTreecode: exemplededcomposition.
Dcompositiondel'arbre. Pourlesalgoocttree.
Plusieurssolutionspossibles.Cadpenddesdtailsde l'implmentationdel'algorithmecommun.
BenoitSemelin2005
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
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
Ligne:nL~n/3,Bb=1
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
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
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:
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
Pourunedfinitionprcisedesfonctions(type,argoptionnels,etc...)voiraide mmoireIDRISetmanuelderfrenceMPIenligne.
BenoitSemelin2005
Goupesetcommunicateurs: objetsdebasedeMPI
Groupe:Ensembledeprocess.
0 2 1 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
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''.
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)
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
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)
Pourraliseruneoprationsurlesdonnesreues,onutiliseunefonctionderduction:
MPI_REDUCE(s_add,r_add,count,datatype,op,root,comm,err)
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
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
W0W
Y0W2 Y X2
BenoitSemelin200
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:
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.
BenoitSemelin200
Dclarerunefentre decommunicationonesided.
Ilfautdfinirunezonemmoireaccessibleparlesprocessdistantslors decommunicationsonesided: MPI_WIN_CREATE(add,size,disp_unit,info,comm,win,err)
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)
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)
Onpeutcombinercesvaleurs(voirmanuelderference).Lesoptimisationscorrespondantesne sontparfoispasimplmentes.
BenoitSemelin200
Cequejen'aipastrait:
Topologiedeprocess Entrssortiesparallles Intercommunications Crationdynamiquedeprocess Packingdedonnes