Notice TP3.f90
Transcription
Notice TP3.f90
10/12/2015 Notice TP3.f90 1 !=============================================================================== !! !MODÉLISATIONETCALCULSCIENTIFIQUE! !! !T.P.n°3:ParallélismeavecMPI! !! !ÉdouardCanot(IRISA/SAGE)0299847489! [email protected]! !http://people.irisa.fr/Edouard.Canot! !! !Déc.2015! !=============================================================================== !########## !#M.P.I.# !########## !MessagePassingInterface ! !=>machinesàmémoiredistribuée ! !Modèledeprogrammation:SPMD(SingleProgramMultipleData) !Onécritunseulprogramme,dontl'exécutableestlancésimultanémentsur !plusieursprocessus(machines,noeudsoucoeurs) !Échangesdesdonnéesparenvoidemessage:1appelpourenvoyer !(appelsdesubroutinesenFortran)1appelpourrecevoir ! !Deuxtypes:Communicationspointàpoint !Communicationscollectives !MPIestunenorme:version1.0en1994 !... !version2.2en2009(chaqueversionajoutedes !fonctionnalités) !version3.0(prévueen2012) ! !=>plusieursimplémentations !ex.MPICH(unedesplusanciennes) !OpenMPI(toutesdeux"OpenSources") ! !Lesversions"propriétaires"(Intel,IBM,Cray,...)sontréputéespourêtre !plusefficaces. !Documentation: ! !CoursMPI(PDF,503slides) ! !+ex.depointd'entréesurleweb: !https://computing.llnl.gov/tutorials/mpi/ ! !https://www.open-mpi.org/doc/ !############### !#EnPratique# !############### !MPIestunenvironnementdeprogrammation. !initialisationdeMPI: integer::ierr!codederetourd'erreur:àcompareràMPI_SUCCESS callMPI_INIT(ierr) !nombredeprocessus: integer::nb_procs callMPI_COMM_SIZE(comm,nb_procs,ierr)!onrécupèrenb_procs !pardéfaut:lecommunicateur(1erargument)estMPI_COMM_WORLD !identificationduprocessuscourant("rang") file:///home/ecanot/div/cours/INSA_Mod_Calc_Sci/TP/2011-2012/3-MPI/Notice TP3.f90 10/12/2015 Notice TP3.f90 2 integer::rang callMPI_COMM_RANK(comm,rang,ierr)!onrécupèrelerang !désactivationdeMPI: callMPI_FINALIZE(ierr) !préparerl'environnement: !$sourceMPI_ENV.sh !pourcompiler:utiliser'mpif90'àlaplacede'gfortran' !(scriptquiutiliselesoptionsadéquates,pourlechemin !desincludesetdeslibrairiesàcharger) !$mpif90-cprog.f90 !$mpif90-oprogprog.o !pourexécuter: !$mpirun-np4./prog(4processussurlamêmemachine) !$mpirun-np4-hostfilemachines./prog(4processussurdesmachines !spécifiéeàl'avance) ! !$catmachines !machine_1slots=3 !machine_2slots=4 !pourconnaîtresamachine !$hwloc-ls(nombredecoeurs) !$htop(mémoiretotaleetchargedelamachine) !##################### !#MPIetFortran90# !##################### !DanslesversionsrécentesdeMPI-Fortran(après2004),ilexisteunmoduleMPI: usempi !permetd'importerlemodule'mpi'(précompiléenf90souslaformempi.mod) !=>interfaçagecompletdel'ensembledesroutinesdeMPI ! !silemodulen'estpasprésent:peutsecompilerparl'utilisateur !(maissouvent,aprèsunephasedeconfigurationcarlefichiersourcempi.f90 !estsouventgénéréautomatiquement) !=>programmationplussûre(cf.appelparmot-clés,interfaçageautomatique,...) !maiscetteinterfacenesemblepasnormalisée... !(parexemple,utiliselagénéricitépourregrouperlesfonctionsMPI) !############ !Remarques# !############ !LesopérationsdeMPIsontd'assezbasniveau:cesontdesdonnéesbinaires !brutesqu'onenvoie(suitede0etde1).Onpeutenvoyeruntypemais !recevoirunautretype(celaveutdirequelesmêmesdonnéesbinairessont !interprétéesdifféremment--cf.lerecastdulangageC) !onemploieraessentiellementquatrecommunicationscollectivesdansceTP: callMPI_BCAST()!diffusiongénérale callMPI_SCATTER()!diffusionsélective(=dispersion) callMPI_GATHER()!collecte(inversedelaroutineprécédente) callMPI_REDUCE()!opérationderéduction:lamêmeopération !appliquée(trèsperformantcarcesopérations !sontrépartiessurtouslesprocesseursregroupés !deuxàdeux--optimumsilenombredeprocesseur !estunepuissancededeux) file:///home/ecanot/div/cours/INSA_Mod_Calc_Sci/TP/2011-2012/3-MPI/Notice TP3.f90