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