Professional Documents
Culture Documents
ParteII. IntroduccinalParalelismo:Herramientas.
FIM2008/9
VicenteMartn v0.2a
HerramientasdeProgramacinParalela
Comomuestradelasmssignificativas,por uso/estandarizacin/filosofanoscentraremosen:
Antesdetratarcadaunoconmsdetalle,veremos susideasbsicasyalgnejemplosimple.
IdeasBsicas.
HPF:Funcionacomodirectivasquepuedenser condicionalmentecompiladas,algunosintrnsecosyatributos queregulaneltipodeejecucin/alcancededatosdeuna subrutina.Pretendeignorarsilamquinasobrelaquefunciona esunmulticomputadorounmultiprocesador. OpenMP:Directivascondicionalmentecompiladasyvariables deentorno.Basadoenhilosdeejecucin.Destinadoa Multiprocesadores.Paralelizacinincremental. MPI:Pasodemensajesexplcitoabasedellamdasafunciones delibrera.Destinadoamulticomputadores.Sobrecarga importanteparaelprogramador.Engeneral,elprogramadebe serdiseadodesdeelprincipiopensandoenMPI.
IdeasBsicas.
Ejemplos.
OMP
ProgramTrapecios
!ElmetododelostrapeciosenversionOpenMP Integer(Kind(1))::n,i Real(Kind(1.D0))::w,x,suma,pi,a Integer::InitialClock,FinalClock,TicksPerSecond Print*,'Numerodeintervalos=' Read*,n w=1.0d0/n suma=0.0d0 CallSystem_Clock(InitialClock) !$OMPPARALLELDOPRIVATE(x),SHARED(w),REDUCTION(+:suma) Doi=1,n x=w*(i0.5D0) suma=suma+f(x) EndDo CallSystem_Clock(FinalClock,TicksPerSecond) Print*,'Segundos:',Float(FinalClockInitialClock)/(Float(TicksPerSecond)) Pi=w*suma Print*,'Pi=',Pi End
ProgramTrapecios !ElmetododelostrapeciosenversionHPF Integer(Kind(1))::n,i Real(Kind(1.D0))::w,x,suma,pi,a Real(Kind(1.D0)),Allocatable::Puntos(:),funcion(:) Integer::InitialClock,FinalClock,TicksPerSecond !HPF$PROCESSORSP(4) !HPF$DISTRIBUTE(BLOCK)ONTOP::Puntos,Funcion Print*,'Numerodeintervalos=' Read*,n Allocate(Puntos(n)) Allocate(funcion(n)) w=1.0d0/n suma=0.0d0 Print*,'***FORALL+IntrinsecoSUM' CallSYSTEM_CLOCK(InitialClock) !HPF$INDEPENDENT ForAll(i=1:n)funcion(i)=4.0D0/(1.0D0+(w*(i0.5D0))**2) suma=SUM(funcion) CallSYSTEM_CLOCK(FinalClock) Print*,'Segundos:',& Float(FinalClockInitialClock)/Float(TicksPerSecond) Pi=w*suma Print*,'Pi=',Pi
HPF
CONTAINS !Funcionpura.RecibeUNESCALARy !devuelveUNESCALAR. PUREREAL(Kind(1.D0))FUNCTIONf(a) Real(Kind(1.D0)),INTENT(IN)::a f=4.0D0/(1.D0+a*a) EndFUNCTIONf !Funcionpura.RecibeUNVECTORydevuelve !otroVECTOR. PUREFunctionfv(a) Real(Kind(1.D0)),Dimension(:),Intent(IN)::a Real(Kind(1.d0)),Dimension(Size(a))::fv fv=4.0D0/(1.D0+a*a) EndFunctionfv EndPROGRAMTrapecios
programmain include"mpif.h" doubleprecisionPI25DT parameter(PI25DT=3.141592653589793238462643d0) doubleprecisionmypi,pi,h,sum,x,f,a doubleprecisionstarttime,endtime integern,myid,numprocs,i,ierr cfunctiontointegrate f(a)=4.d0/(1.d0+a*a) callMPI_INIT(ierr) callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr) callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr) 10if(myid.eq.0)then print*,'Enterthenumberofintervals:(0quits)' read(*,*)n endif cbroadcastn starttime=MPI_WTIME() callMPI_BCAST(n,1,MPI_INTEGER,0, &MPI_COMM_WORLD,ierr) ccheckforquitsignal if(n.le.0)goto30 ccalculatetheintervalsize h=1.0d0/n sum=0.0d0
MPI
do20i=myid+1,n,numprocs x=h*(dble(i)0.5d0) sum=sum+f(x) 20continue mypi=h*sum ccollectallthepartialsums callMPI_REDUCE(mypi,pi,1,MPI_DOUBLE_PRECISION, &MPI_SUM,0,MPI_COMM_WORLD,ierr) cnode0printstheanswer. endtime=MPI_WTIME() if(myid.eq.0)then print*,'piis',pi,'Erroris',abs(piPI25DT) print*,'timeis',endtimestarttime,'seconds' endif goto10 30callMPI_FINALIZE(ierr) stop end
/*Copyright(C)2000ChenJianxun,SebastienChauvin,TarekElGhazawi*/ #include<upc.h> #include<upc_relaxed.h>/*modoporomision,noesnecesarioponerlo*/ #include<math.h> #defineN32767 #definef(x)1/(1+x*x) upc_lock_tl; sharedfloatpi; voidmain(void) { floatlocal_pi=0.0; inti; upc_forall(i=0;i<N;i++;i%THREADS) local_pi+=(float)f((0.5+i)/N); local_pi*=(float)4.0/N; upc_lock(&l); pi+=local_pi; upc_unlock(&l); upc_barrier1;//Ensureallisdone if(MYTHREAD==0)printf("PI=%10.9f\n",pi); }
UPC
HPF
Lenguajedeprogramacincompletoparaprogramacin tipoparalelismodedatos(modeloSPMD). Objetivos:Buenrendimiento,portabilidad, compatibilidadconellenguajebase(f95).Tantoen mquinasdememoriacompartidacomodistribuida. Entraenformadedirectivas(salvointrnsecosnuevos) enelprogramafuente. Especificacin1.0en1993.La2.0en1997.Lamayora deimplementacionessonsubsetde1.1 Procesodecompilacinmuycomplejo,rendimiento difcildeprever.Futuroincierto.
IntroduccinaHPF
ElmodelobsicodefuncionamientodeHPFse conocecomoSPMD(SingleProgramMultipleData). Unprogramanicoseejecutasimultneamenteenuna seriedeprocesadoresactuandosobreconjuntosde datosdistintos. Porello,lasprincipalesdirectivasdeHPF(marcadas con!HPF$)seocupandedistribuirconjuntosde datosalineados(conunarelacindeproximidadde uso)entresisobrearraysregularesde procesadoresque,enprincipio,sonvirtuales.
Modelodeasignacindedatosaprocesadoresfsicos.
Directivas:DistribucindeDatos
Dbpp:Foster
Directivas:CreacindeDisposicionesde Procesadores
!HPF$processorslinea(4) !HPF$processorsred(2,2)
Laprimeracreaunvectorconcuatroprocesadores. Lasegunda,unamatrizde2x2procesadores.
Directivas:CreacindeDisposicionesde Procesadores
Sepuedeaveriguarelnmerodeprocesadores disponiblesysuformausandolosintrnsecos:
NUMBER_OF_PROCESSORS():Sepuedeutilizardentrode unalneainiciadacon!HPF$comoen
!HPF$ProcessorsLinea(NUMBER_OF_PROCESSORS())
Directivas:DistribucindeDatos
Sobrelasdisposicionesdeprocesadoressedistribuyen losdatosalineadosusandoDISTRIBUTE. AdmitecomoparmetrosBLOCK,CYCLICo*(que expresaquenohabrdistribucin)BLOCKyCYCLIC admitenunargumentoindicandoeltamaodebloqueo elciclo. Lasnicastablasdistribuiblessonlosobjetivosde alineamientofinal:Referenciasparalosalineamientos delasdemstablasyqueellasmismasnoestn alineadasconninguna.
EjemplodeDirectivasBsicas.
Imaginemosquehemosdefinidolasdisposicioneslinea(4)yred(2,2)como enlosejemplosanterioresyquetenemosunamatrizMde8x8.
EfectoenlasComunicaciones.
A,B,INXsedistribuyeenbloquesobrePROCS:
A(1:100)enPROCS(1);A(101:200)en PROCS(2)etc.
Lasasignacionesgenerarn,enprincipio,lassiguientes asociaciones:
(1)Paratodoi,A(i)yB(i)deberniralmismo procesador:Nosegenerancomunicaciones.
(2)XeYnoestnasignadosaningnprocesadorespecfico, perossehaconcretadosualineamientorelativo,demodoque nohaycomunicacinseacualsealadistribucindeXeYsobre PROCS. (3)Parecidoa(1),peroladistribucincclicadeChaceque A(i)coincidaconC(i)slounadecada10veces:mucha comunicacin. (4)LamayoradelosaccesosaAsonlocales.Slohay comunicacionesenlafrontera(i=100*k+1,i=100*k; k=1,2...9)
(5)Parecidaa(4),peroconCendistribucincclica C(i1)yC(i+1)siempreenprocesadoresdistintos,por loquesiempreseproducirncomunicaciones. (6)XeYsloestnafectadosporunALIGNque especificaqueX(i)eY(i1)estnenelmismo procesador,locualnodicenadasobrelaposicinrelativade X(i)eY(i),asquenadapodemosdecirsobrelas comunicaciones. (7)A(INX(i))estarenelmismoprocesadorque B(INX(i)).LomismovaleparaA(i),B(i)eINX(i), perosinconocerlosvaloresdeloselementosINX(i),nada sabemosdelarelacinentreA(i),A(INX(i))y B(INX(i)).
FacilidadesAdicionalesconAlineamientos
Ejemplo:DuplicacindeDatos
OtrasConstrucciones
HPFcontienemselementosparaexpresarparalelismoo modosdeejecucin.Algunosestnenf95.
SentenciaFORALL(tambinenf95):
FORALL(especificacionesndices[,mscara])Asignacin FORALL(especificacionesndices[,mscara])
Sentenciasdeasignacin ENDFORALL
Ejemplo:
FORALL(I=1:N,J=1:N,A(J,I).NE.0.0)B(I,J)=1/A(J,I)
DirectivaINDEPENDENT:AplicableabuclesDOo sentenciasFORALL.
EnunbucleDosignificaquendicesdistintosdelbucleno interfierenysepuedencalcularenparalelo.
Ewing/EPCC
Ewing/EPCC
NuevasLibreras.
HPF_LIBRARYyHPF_LOCAL_LIBRARY
LasfuncionesdeHPF_LIBRARYpuedenserllamadasdesde cualquiermododefuncionamiento. HPF_LOCAL_LIBRARYslodesderutinasmarcadas Extrinsic(HPF_LOCAL).Atiendealaconversinentre losmodosdefuncionamientoHPF_GLOBALyHPF_LOCAL: MY_PROCESSOR,PHYSICAL_TO_ABSTRACT, LOCAL_TO_GLOBALyaadenuevasfuncionesde reduccin,combinacin/dispersin.Elnmerodefunciones implementadasvaradesistemaensistema.Esnormal disponerdefuncionesdeinformacin: HPF_DISTRIBUTION,HPF_ALIGNMENTy HPF_TEMPLATE.
OpenMP
Especificacinde1998.Versin2.0(f90)en2000,C C++en2002.Versin2.5(Fortran+C/C++)en2005. Draft3.0Oct.2007(Mayorcambio:tareas).Acordado porunaseriedefabricantesdeHW/SWyusuarios. APIdestinadoamquinasdememoriacompartida. Entraenelprogramafuenteesencialmenteenformade directivasdecompilacin. BindingsparaF77,f90,CyC++. Permiteunaparalelizacinincremental.Ocupaun lugarintermedioentreelaltoniveldeHPFyelbajo niveldeMPI.
ModelodeEjecucinenOpenMP
Usodehilosdeejecucin (threads).Cadaprocesopuede consistirdevarioshilos,cadauno consupropioflujodecontrol (inclusodatosprivados)pero compartiendoelmismoespacio dedirecciones. Secomienzaconunslohilo (master)quepuedeiniciarotros hilos(quetambinpodraniniciar mshilosconvirtiendoseasuvez ennuevosmaster)enunaseccin paralelaquesonrecogidosalfinal (fork/join)
ModelodeMemoria
Memoriacompartida,consistenciarelajada.
OpenMP:Estructura.
Variablesdeentorno.
Elvalorporomisinesdependientedelaimplementacin. Ej.:setenvOMP_SCHEDULEstatic,100
OMP_NUM_THREADS:Controlaelnmerodehilosde ejecucinenlosqueseabreunareginparalela
OpenMP:Directivas
Reginparalela:
!$OMPPARALLEL[espec.[[,],espec.]...] [Bloquedecdigo] !$OMPENDPARALLEL
Losndicesdeunbuclesonconsideradoscomoprivados poromisin.
Alfinalizarunareginparalelahayunasincronizacinimplcita. Sloelhilomastercontinualaejecucin
Distribucindetrabajo:BuclesDo,seasignaun conjuntodeiteraciones(ndices)acadahilodisponible.
!$OMPDO[especificaciones] [BucleDo] !$OMPENDDO[NOWAIT]
DistribucindeltrabajodentrodelosbuclesDo: SCHEDULE
STATIC(tamaodebloque)
DYNAMIC(tamaodebloque)
GUIDED(tamaoinicialdebloque)
AUTO
Distribucindetrabajo:Secciones:Cadabloquees ejecutadoporunsolohilo.
!$OMPSECTIONS[especificaciones] [bloquedecdigo] !$OMPSECTION [bloquedecdigo] .... !$OMPENDSECTIONS[NOWAIT]
TantoSECTIONScomoDOsesuelenagruparcon PARALLEL
!$OMPPARALLELSECTIONS [especificadores] !$OMPPARALLELDO[especificadores]
Hayunciertocontrolsobrequejecutacadahilo:
El[Bloquedecdigo]esejecutadoporunsolohilo:
El[Bloquedecdigo]esejecutadosoloporelhilomaster,
losdemssaltanelbloqueycontinuan.
!$OMPCRITICAL[lista] [Bloquedecdigo]
!$OMPBARRIEREstableceunpuntodebarreraparalos hilosdeejecucin.
!$OMPATOMICAseguraqueunadeterminadaposicindela
memoriacompartidatieneaccesoexclusivosloporunhilocada vez.Serefiereatodosloshilosqueejecutanelprogramayactua slosobrelasentenciadeasignacininmediatamenteposteriorala declaracindeATOMIC.
!$OMPFLUSH(lista)Aseguraquecadahiloquese
encuentraestasentenciasincronizalosvaloresdelasvariablesen (lista)(sinoaparecenserefiereatodaslasvariablesnoprivadas delhilo)desuvistatemporalconlosvaloreslamemoriacentral compartida.
Algomssobrealcancededatos.
THREADPRIVATE[lista]haceque[lista]sea privadoacadahiloperoglobalesdentrodelhilo.
SHARED[lista]establecelasposicionesdememoria ocupadaspor[lista]comoreacompartida.Elquetodos loshiloscompartanlasmismasposicionesnogarantizaque uncambioenunavariableseavistoinmediatamenteporel restodeloshilosyaquecadaunopuedetenerunavista temporaldistinta.Estoesslociertodespusdeuna sincronizacin.SepuedeconseguirtambinconFLUSH. REDUCTIONLasvariablesqueentranenestaclusuladeben serSHARED,aunquecadahilolastratecomosifuesen PRIVATE,utilizandounavariablelocalacadahiloquees inicializadadeacuerdoaloperadorusado:a0sies+,a1si es*,.TRUE.sies.and.,etc.
AlgunasfuncionesenOMP_LIB
UseOMP_LIBoIncludeomp_lib.h
omp_set_num_threads omp_get_thread_num omp_get_num_procs omp_set_dynamic omp_in_parallel omp_set_nested omp_set_lock/omp_unset_lock omp_destroy_lock omp_get_wtime omp_get_wtick
Programvida Implicitnone !Integer::i,n,numgen,vivos Integer,parameter::n=100,numgen=1000 Integer::i,vivos Integer::tinicial,tfinal,numticks !Integer,Allocatable::tablero(:,:),vecinos(:,:) Integer,Dimension(n,n)::Tablero,Vecinos !!HPF$PROCESSORSred(2,2) !!HPF$PROCESSORSlinea(4) !!HPF$Distributetablero(BLOCK,BLOCK)ONTORED !!HPF$Distributevecinos(BLOCK,BLOCK)ONTORED !HPF$Distribute(*,block)::tablero,vecinos !Print*,'Tamaotablero:' !Read*,n !Print*,'Numerodegeneraciones:' !Read*,numgen !Allocate(tablero(n,n)) !Allocate(vecinos(n,n)) !Tableroinicial: tablero=0 tablero(:,n/2)=1 tablero(n/2,:)=1 vivos=sum(tablero) CallSystem_Clock(tinicial,numticks)
Paralelizar enOMP?
!Sehacennumgengeneraciones Doi=1,numgen
HPF
!Secalculaelnumerodevecinosdecadacelda. vecinos=tablero+cshift(tablero,shift=1,dim=1)& +cshift(tablero,shift=+1,dim=1) vecinos=vecinos+cshift(vecinos,shift=1,dim=2)& +cshift(vecinos,shift=+1,dim=2) vecinos=vecinostablero !Seactualizaeltableroysecalculaeltotaldevivos. Where(vecinos==3)tablero=1 Where(vecinos<2.or.vecinos>3)tablero=0 EndDo vivos=sum(tablero) CallSystem_Clock(tfinal) print*,'vivos=',vivos print*,'tiempoCPU(segs.)=',Float(tfinaltinicial)/Float(numticks) End
Programvidaf77 ImplicitNone Integeri,j,loop,vivos,n,numgen Integertinicial,tfinal,nticks Realrtinicial,rtfinal !Parameter(n=100,numgen=1000) !Integertablero(0:n+1,0:n+1),vecinos(n,n) Integer,Allocatable::tablero(:,:),vecinos(:,:) Print*,'Dimensiontablero=' Read*,n Print*,'Numerodegeneraciones=' Read*,numgen Allocate(tablero(0:n+1,0:n+1)) Allocate(vecinos(n,n)) vivos=0 !$OMPPARALLELDOREDUCTION(+:vivos) Doj=1,n Doi=1,n If((i.eq.n/2).or.(j.eq.n/2))then tablero(i,j)=1 vivos=vivos+1 Else tablero(i,j)=0 EndIf EndDo EndDO
Paralelizar enOMP?
print*,'vivosiniciales=',vivos CallCPU_Time(rtinicial) callsystem_clock(tinicial,nticks) Doloop=1,numgen !$OMPPARALLELDO Doi=1,n tablero(i,0)=tablero(i,n) tablero(i,n+1)=tablero(i,1) tablero(0,i)=tablero(n,i) tablero(n+1,i)=tablero(1,i) EndDo
F77+OMP
!$OMPPARALLELDO Doj=1,n Doi=1,n vecinos(i,j)=tablero(i,j+1)+tablero(i,j1)& +tablero(i+1,j)+tablero(i1,j)& +tablero(i+1,j+1)+tablero(i1,j1)& +tablero(i+1,j1)+tablero(i1,j+1) EndDo EndDo vivos=0
!$OMPPARALLELDOREDUCTION(+:vivos) Doj=1,n Doi=1,n if((vecinos(i,j).lt.2).or.(vecinos(i,j).gt.3))then tablero(i,j)=0 elseif(vecinos(i,j).eq.3)then tablero(i,j)=1 endIf if(tablero(i,j).eq.1)vivos=vivos+1 EndDo EndDo EndDo Callsystem_clock(tfinal) CallCPU_Time(rtfinal) Print*,'vivosalfinal=',vivos Print*,'segs=',float(tfinaltinicial)/Float(nticks) Print*,'segsCPU=',rtfinalrtinicial End
MPI
Estndardefactodelmodelodepasodemensajes.Acordadopor empresas,universidadesyotroscentrosdeinvestigacin. Orientado,sobretodo,amulticomputadores.(Loquenoquiere decirquenohayaimplementacionesenmultiprocesadores) Versin1.0en1994,2.0en1997.SeaadeI/Oparalela,creacin ydestruccindinmicadetareas,etc. Elprogramadortienequeocuparsedecasitodo:MPIaisladelas partesmsprximasalHW,peronodelalgicadelpasode mensajes. BindingsparaF77,C,C++,f90(concaveats...)inclusoJava.
IntroduccinaMPI.
MPItiene129funcionesenv.1.1.La2.0aadeI/O paralelaycreacin/destruccindeprocesosentreotros.
ComunicacionesenMPI
Cadaprocesoperteneceaunoomscomunicadoresque especificanuncontexto. Cadaprocesotieneunidentificadornico(rank)dentrodel comunicador. CuandoMPIseinica,secreaelcomunicadorporomisin MPI_COMM_WORLDqueincluyeatodoslosprocesos. LosprocesossecomunicanatravsdellamadasMPI,biensean comunicacionespuntoapunto(usandolapareja comunicador+identificador)ocolectivas(usandoelcontexto provistoporelcomunicador).
ComenzandounprogramaMPI
InicializacindeMPI
include'mpif.h'!usempif(f90bindingsMPI2.0) CallMPI_INIT(IError)
Obteniendoelidentificadordelproceso(rank)dentro delcomunicadorporomisinMPI_COMM_WORLD
CallMPI_COMM_RANK(MPI_COMM_WORLD,IRank,IError)
Obteniendoelnmerodeprocesosenelcomunicador
MPI_COMM_WORLD
CallMPI_COMM_SIZE(MPI_COMM_WORLD,ISize,IError)
TerminandoMPI
CallMPI_FINALIZE(IError)
Mensajes
Unmensajeesunconjuntodeelementosdeuntipo definidoconocidoporMPI,conloquenohay problemacondistintasrepresentacionesHWdel mismotipoenentornosheterogneos. LostiposbsicosconocidosaMPIsonlosestndares enC(MPI_INT,MPI_UNSIGNED,etc)yFortran (MPI_INTEGER,MPI_REAL,etc.)ConMPI2tambin haysoporteparaloskinddef90. Sepuedendefinirtiposderivadosviallamadasalas rutinasMPI_TYPE_...quedespussedanaconoceral sistemaMPIconMPI_TYPE_COMMIT
ContenidodeunMensaje
Unallamadatpicaaunarutinadeenviodemensajes tienequerecibirentonces:
TiposdeMensajes
Lasrutinasdecomunicacinpuedenser:
Queunacomunicacinsehayacompletadosignificaque lasdireccionesdelbufferpuedenseraccedidas.
Segnlascondicionesdecomplecinhaymsvariantes:
Ejemplo:Envio/Recepcinbloqueante.
CallMPI_SEND(Buffer,Count,MPI_Double_Precision, Idest,ITag,MPI_COMM_WORLD,IErr)
EnviaCountelementosdeltipoMPI_Double_Precision,contandoapartirde
ladireccinBuffer,alprocesoconidentificadorIdestdelcomunicador MPI_COMM_WORLD.ElmensajetieneuntagItag.Elcdigodeerrorse almacenaenIerr.
CallMPI_RECV(Buffer,Count,MPI_Double_Precision,
MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,Status, Ierr)
RecibeenBuffer,CountelementosdeltipoMPI_DOUBLE_PRECISION procedentesdecualquierprocesodelcomunicadorMPI_COMM_WORLDaceptando cualquiertag.Adems,enStatus,vectordelongitudMPI_STATUS_SIZE tenemosinformacinadicional:Status(MPI_SOURCE)contieneelidentificador delprocesoqueenvielmensaje.Status(MPI_TAG)contieneeltagdel mensaje.
Ejemplo:Envio/RecepcinNobloqueante.
CallMPI_ISEND(Buffer,Count,DataType,IDest,ITag, Comm,IRequest,IErr) Noseesperaaquecompletelacomunicacinparacontinuar.Bufferno debesermanipuladohastacomprobarquelaoperacinhasidocompletada: CallMPI_TEST(IRequest,Flag,Status,IErr) QuepondrFlaga.true.SielmensajeindicadoporIRequestha sidocompletado.Sepuedeforzarlaesperadelacomplecincon: CallMPI_WAIT(IRequest,Status,IErr) Larecepcincorrespondientees: CallMPI_IRECV(Buffer,Count,DataType,ISource, ITag,Comm,IRequest,IErr)
ComunicacionesColectivas
Broadcast:
MPI_BCAST(Buffer,Count,DataType,Root,Comm_IErr) SielidentificadordelprocesocoincideconRoot,envia,sinorecibe.
SincronizacinentrelosprocesosdeComm: Operacionesdereduccin:
MPI_BARRIER(Comm,IErr)
MPI_REDUCE(SendBuffer,ReceiveBuffer,Count,DataType, Op,Root,Comm)
HaceunaoperacindereduccinconeloperadorOpdeloscontenidosde
SendBuffer(CountelementosDataType)escribiendoelresultadoen ReceiveBufferdelprocesoRoot.Laoperacinesunadelas predefinidas(Ej:MPI_SUM)odefinirseconMPI_OP_CREATE
TiposDerivados
Apartirdelostiposbsicossepuedenderivarotros tilesparalasrutinasdecomunicaciones
Gropp94
Ejemplo:Creacindeunasubmatriz.
ParaqueMPIacepte(yoptimice)NewType: CallMPI_TYPE_COMMIT(NewType,IError)
CreacindeTopologas
Adaptacinentrelatopologadelhardwareyla requeridaporlaaplicacin.
I/OParalela
Defineelaccesodeunficheroavariosprocesosde maneraconcurrente,paraello:
Lusk97http://www.mpiforum.org/docs/
Creacinycontroldeprocesos.
grandequepuedellegaraserelentornodeejecucin.
Comunicaccindirigidalocalmente (onesided)
MPI+OMP
programmain include"mpif.h" real,parameter::PI25DT=3.141592653589793238462643 real(kind(1.0D0))::mypi,pi,h,sum,x,f,a real(kind(1.0D0))::inicio,final,tics integer::n,myid,numprocs,i,ierr !ExternalMPI_WTIME,MPI_WTICK f(a)=4.d0/(1.d0+a*a) callMPI_INIT(ierr) callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr) callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs, ierr) tics=MPI_WTICK() if(myid==0)then Print*,'MyId:',myid Print*,'Numprocs:',numprocs Print*,'Resoluciondereloj(tics/seg.):',tics print*,'Enterthenumberofintervals:(0quits)' read*,n endif inicio=MPI_WTIME() callMPI_BCAST(n,1,MPI_INTEGER,0, &MPI_COMM_WORLD,ierr) if(n>0)then h=1.0d0/n sum=0.0d0 !$OMPPARALLELDOPrivate(x)Shared(h)Reduction(+:sum) doi=myid+1,n,numprocs x=h*(dble(i)0.5d0) sum=sum+f(x) !print*,myid,x,sum enddo mypi=h*sum callMPI_REDUCE(mypi,pi,1,MPI_DOUBLE_PRECISION, &MPI_SUM,0,MPI_COMM_WORLD,ierr) final=MPI_WTIME() If(myid==0)then Print*,'piis',pi,'Erroris',abs(piPI25DT) Print*,'Segs.=',(FinalInicio) endif else stop endif callMPI_FINALIZE(ierr) stop end
UPC
ExtensiondelANSICconideasdelmodelodeespaciode direccionesglobalparticionado:Memoriacompartidacon informacindequeslocalyquesremoto. Denuevounconsorcio:Universidades,laboratoriosy fabricantes.Especificacin1.0en2001,1.1en2003.1.2 Hilosdeejecucin+memoriaprivadadelhilo+memoria globaldivididaenparticiones+relacindeafinidadentre particionesehilos(laparticinresideenelespaciodememoria lgicodelhilo). Punteroscompartidosconaccesoatodoelespacioglobal. Posibilidaddeespecificarconsistenciaestrictaorelajada duranteelaccesoaposicionescompartidasporvarioshilos.
ModelodeProgramacin/Memoria
DSM:DistributedSharedMemory.Pensadoparahaceruso eficientedelalocalidaddedatosenmquinasNUMA.
Hilosdeejecucinconmemoriaprivada
UPCsepretendequeseafcildeusar:Funcionacomouna extensinnodemasiadograndedeC.
ElementosdelLenguaje:palabrasreservadas
Keywords: MYTHREADstrict relaxedTHREADS sharedUPC_MAX_BLOCK_SIZE Functions: upc_addr_fieldupc_lock_attempt +cabeceras upc_all_lock_allocupc_lock_free upc_global_lock_allocupc_lock_t (<upc_strict.h>, upc_all_allocupc_memcpy <upc_relaxed.h>, upc_allocupc_memget <upc.h>)+ upc_barrierupc_memput upc_blocksizeofupc_memset variablesde upc_elemsizeofupc_notify upc_fenceupc_phaseof entorno+funciones upc_forallupc_threadof upc_freeupc_resetphase delibrera upc_global_allocupc_unlock upc_global_exitupc_wait upc_localsizeof
Variables:
ElementosdelLenguaje.
(dependientedelcompilador)
Declaracindevariables:
shared:Lavariableescompartida.Sinoseespecificanada,poromisinsonprivadas
yseasignanalamemoriadelhilo0.
Modelodeconsistenciadememoria:
strict:Losdatoscompartidossonsincronizadossiempreantesdecadanuevo
Modelodeconsistenciadememoria:Scoping
strictyrelaxed:puedenmarcarprogramascompletos,bloquesosolovariables.
#include<upc_strict.h>
voidmain(){ } #include<upc_relaxed.h> voidmain(){ } #include<upc_relaxed.h> sharedintcounter=0; voidmain(){ ... { #pragmaupcstrict counter++; printf(Counter=%d\n,counter); } ...
Declaracionesglobales
} Elbloquemsinternoenmodoestricto.Elrestoen relajado.
Lavariablecounterenmodoestricto,todolo demsenrelajado.
Datoscompartidos.
shared[2]intA[4][2];
(sobre3hilos)
Sincronizacin:
Barrerasbloqueantes:upc_barriercadahiloesperaa quetodoslosdemslleguenalpuntodesincronizacin.
... sharedinta=0; intb; intmain(){... do{ ACTUALIZAa } upc_barrier; b=a; ... }
Barrerasendosfases(nobloqueantes,splitphase):
upc_notifyid upc_waitid
Cerrojos:
voidupc_lock(upc_lock_t*lock) voidupc_unlock(upc_lock_t*lock)
upc_lock_t*upc_all_lock_alloc(void)
upc_lock_t*upc_global_lock_alloc(void)
Distribucindetrabajo:
upc_forall(i=0;i<N;i++;i) upc_forall(i=0;i<N;i++;i*THREADS/N)
Cadahilorecibeunbloquedetrabajo
Laiteracinlahaceelhiloquetieneafinidadconla direccin&a[i]:
upc_forall(i=0;i<N;i++;&a[i])
#include<upc_relaxed.h> #defineN100*THREADS shared[N]doubleA[N][N]; shareddoubleb[N],x[N]; voidmain() { inti,j; /*readingtheelementsofmatrixAandthe vectorxandinitializingthevectorbtozeros */ upc_forall(i=0;i<N;i++;i) for(j=0;j<N;j++) b[i]+=A[i][j]*x[j]; }
Reservadinmicadememoria:
sharedvoid*upc_all_alloc(size_t nblocks,size_tnbytes)
sharedvoid*upc_global_alloc(size_t nblocks,size_tnbytes)
voidupc_free(sharedvoid*ptr)
nocolectiva
colectiva
Libreras:Operacionescolectivas
upc_flag_tUPC_{IN,OUT}_{NO,MY,ALL}SYNC;
Estableceelcontrolparaelmododesincronizacindemuchas operacionescolectivas.Losvaloresdelosargumentosde funcionesdeltipoupc_flag_tseformanhaciendounOR conunaconstanteUPC_IN_{NO,MY,ALL}SYNCyotra UPC_OUT_{NO,MY,ALL}SYNC Ej:(UPC_IN_NO_SYNC|UPC_OUT_NO_SYNC)establece quelafuncinconestosvaloresenlallamadapuedeempezara leeroescribirdatostanprontocomounhiloentreenlafuncin ylopuedecontinuarhaciendohastaqueelltimohilohaya salidodelallamada.MYsignificaquesololasposicionescon afinidadaalgnhiloquehayaentradosonaccesibles.ALL,que todosloshilosdebenhaberentrado.
Ejemplos:
Otrosejemplosdefuncionescolectivasenlalibrera
Hayms,faltan:
Bibliografa.
HighPerformanceFortran:
A.K.Ewingetal.WritingParallelProgrammeswithHigh PerformanceFortran.EdinburghParallelComputingCentre. http://www.epc.ed.ac.uk/epcctec/courses.html C.H.Koelbeletal.TheHighPerformanceFortranHandbook. ScientificandEngineeringComputationSeries,TheMIT Press,1994. AA.VV.HighPerformanceFortranLanguajeSpecification. HighPerformanceFortranForum,1997. http://www.crcp.rice.edu/HPF AA.VV.HPFTutorial.HewlettPackard2001. http://www.hp.com/techservers/tutorials3/hpf.html ThePortlandGroup.HPFparaunagranvariedadde plataformas.Manualesenlnea:http://www.pgroup.com
OpenMP:
MPI:
W.Groppetal.UsingMPI:PortableParallel ProgrammingwiththeMessagePassingInterface. ScientificandEngineeringComputationSeries.TheMIT Press,1994.TambinconMPI2,1999. M.Sniretal.MPI:TheCompleteReference,Vol.1:The MPICore.W.Groppetal.Vol.2:TheMPI2Extensions. ScientificandEngineeringComputationSeries.TheMIT Press,1998. http://www.mpiforum.org/docs/ TheMPIStandardspagehttp:/wwwunix.mcs.anl.gov/mpi Netlib:TheNetLibraryhttp://www.netlib.org/mpi CursosenEPCChttp://www.epcc.ed.ac.uk IMPI:InteroperableMPI.http://impi.nist.gov/IMPI
UPC: