You are on page 1of 94

TcnicasdeComputacinCientfica

ParteII. IntroduccinalParalelismo:Herramientas.

FIM2008/9
VicenteMartn v0.2a

HerramientasdeProgramacinParalela

Comomuestradelasmssignificativas,por uso/estandarizacin/filosofanoscentraremosen:

HighPerformanceFortran:HPF MessagePassingInterface:MPI OpenMultiProcessing:OpenMP UnifiedParallelC:UPC

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.

UPC:ExtensinndeC(nuevaspalabrasreservadas,tipos, variablesdeentorno,funcionesdelibrera).ModeloDSM (DistributedSharedMemory).Pensadoparahacerusoeficiente delalocalidaddedatosenmquinasNUMA.Basadoenhilos deejecucinyenunamemoriaglobal(ademsdelaprivadade cadahilo)endondesepuedeestablecerunarelacindeafinidad deunaseccinconundeterminadohiloparamantenerla localidaddereferenciasentrelosdatosnecesariosyelhiloque losprocesa.

Ejemplos.

Paraobtenerunaideadelostresparadigmas,de sufilosofa,complejidadyrendimiento,los siguientesprogramascalculanelvalordela integralporelmtododelostrapecios:


4 =0 dx 2 1 x
1

EnelcasodeHPFsedanvariasdeclaracionesdela funcin,todascorrectas,paraestudiareldistinto rendimientodecadauna(enelejemplosloseusa una,inlined)

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

ALIGN:Especifica elementosque,sies posible,sern asignadosalmismo procesador,demodo queoperacionesentre elementosalineados mantendrnlocalidad dereferencias..

Lasdimensiones* nosedistribuyen:se colapsan

Dbpp:Foster

Directivas:CreacindeDisposicionesde Procesadores

Paracrearlasdisposicionesregulares(cartesianas) deprocesadoresabstractossobrelasquese distribuirnlosdatosalineados. DirectivaPROCESSORS:


!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())

PROCESSORS_SHAPE():Sinoapareceunadirectiva PROCESSORS,elsistemausarunaporomisin,quenotiene porquserptima.SielHWsobreelquefuncionaesun multiprocesadorUMA,laformadedistribucinde procesadoresnotendrmuchoimpacto.

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.

Estastresdirectivasespecificancualessernlas comunicacionesenunaoperacindada. Ejemplo(delestndar),sitenemoselsiguientetrozode cdigo:


RealA(1000),B(1000),C(1000),X(500),Y(0:501) IntegerINX(1000) !HPF$ProcessorsPROCS(10) !HPF$DISTRIBUTEA(BLOCK)ONTOPROCS !HPF$DISTRIBUTEB(BLOCK)ONTOPROCS !HPF$DISTRIBUTEINX(BLOCK)ONTOPROCS !HPF$DISTRIBUTEC(CYCLIC)ONTOPROCS !HPF$ALIGNx(I)WITHY(I1) A(I)=B(I)!(1) X(I)=Y(I1)!(2) A(I)=C(I)!(3) A(I)=A(I1)+A(I)+A(I+1)!(4) C(I)=C(I1)+C(I)+C(I+1)!(5) X(I)=Y(I)!(6) A(I)=A(INX(I))+B(INX(I))!(7)

A,B,INXsedistribuyeenbloquesobrePROCS:

A(1:100)enPROCS(1);A(101:200)en PROCS(2)etc.

Csedistribuyecclicamente:C(1),C(11),..., C(991)irnaPROCS(1).C(2), C(12),...,C(992)aPROCS(2) LadistribucindeXeYsobrePROCSnoest especificada,perossualineamientorelativo.

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)).

Notarquecuandosediceasignadosalmismoprocesadorserefiereaun procesadorabstracto,laasignacindevariosdeestosaunsloprocesador fsicopuedealiviarlosefectosdelascomunicacionesenalgunoscasos.

FacilidadesAdicionalesconAlineamientos

TEMPLATEparaexpresaralineamientosmltiples relativosconreferenciaaunobjetomayorsinnecesidadde reservarespacioparaste.Nohabiendoreservade memorianopuedeserusadoenargumentosdesubrutinas nibloquesCOMMON.

IntegerA(10,20),B(12,8),C(10,10) !HPF$TEMPLATET(20,35) !HPF$ALIGNA(I,J)WITHT(I+1,J+1) !HPF$ALIGNB(I,J)WITHT(I+5,J+18) !HPF$ALIGNC(I,J)WITHT(I+1,J+24) !HPF$DISTRIBUTET(BLOCK,CYCLIC)

Ejemplo:DuplicacindeDatos

Unvector,detamaorelativamentepequeo,quese accedemuchasveces,bienensutotalidadode maneraimpredecible,juntoconloselementosdeuna matrizdemayortamaoescopiadojuntoconcada trozorepartidodelamatrizgrande.Destemodolos accesosalvectorsonlocales.

Notarqueladuplicacindedatos,sielobjetoseactualiza confrecuencia,puedeproducirunamayorcargade comunicaciones.Hayquehacerunanlisispreviodelas ventajas/inconvenientesquepuedeproducir.

Ejemplo(Ewing, Koelbel):Elvector lut,alineadoconcada elementodelamatriza esdistribuidoenuna redde2x2 procesadores.

OtrasConstrucciones

HPFcontienemselementosparaexpresarparalelismoo modosdeejecucin.Algunosestnenf95.

SentenciaFORALL:Parahacerasignacionesenparalelo. DirectivaINDEPENDENT:Garantizaquelaejecucinde iteracionesnotienendependenciasunasdeotras. AtributoPURE:Lasfuncionesasmarcadasgrantizanqueno tienenefectosqueimpidansuusoenconstruccionesparalelas. Operacionesglobalesenarrarys:SUM,MAXLOC,MINLOC,etc. HPF_GLOBAL,HPF_LOCAL,HPF_SERIAL.Declaraciones paraEXTRINSICquegarantizanuntipodeejecucindela rutinamarcada.

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)

FORALLseevaluaencuatropasos:1)Calcularelconjuntovlidodendices (especificacionesndices).2)Definirelconjuntoactivodendices(mscara).3) Evaluarlosladosderechodelaasignacin.4)Realizarlasasignaciones. Claves:Todosloselementosdecadapasodebenpoderserrealizadosen cualquierorden.Cadapasodebesercompletadoantesdelsiguiente.


FORALL(I=1:N)S=V(I)!MALFORALL(I=1:N,J=1:I)A(I,J)=A(I,J)/ A(I,I)!NoConformeFORALL(I=1:N,J=1:N,J.LE.I)A(I,J)=A(I,J)/ A(I,I)!ok

DirectivaINDEPENDENT:AplicableabuclesDOo sentenciasFORALL.

EnunbucleDosignificaquendicesdistintosdelbucleno interfierenysepuedencalcularenparalelo.

DeclaracindeunavariablecomoNEWparasignificarqueesa variableseusaslodentrodecadaiteracindelbucleDO:su valorendistintasiteracionesnotienerelacinninguna.

EnunFORALLeliminalassincronizacionesobligadasentre lasevaluacionesdelosladosderechosyasignacionesdelos izquierdos.

Nohabrmuchagananciasinohaydiferenciassignificativasde tiemposentredistintasevaluacionesdelosladosderechospara distintosndicesactivos.

Ewing/EPCC

Ewing/EPCC

Elmododeejecucinconelquecorreunarutinapuedeser modificadoatravsdeladeclaracinEXTRINSIC. Estoesmuytilcuandosedeseausarunarutinaaltamente optimizadaparaunamquinasecuencialdesdeunprograma HPFohayunaseccincrticadecdigoqueslodebaser ejecutadaporunaCPU.

EXTRINSIC(HPF_GLOBAL)Modoporomisinsinose declara.Eselmodelodeejecucinnormal,yacomentado.I/Oen elprocesador0. EXTRINSIC(HPF_LOCAL)Todoslosprocesadorescorrenla rutinaconaccesoexclusivamentelocaladatos(normalmente cadaseccindelocaldelosdatosdistribuidos).tilparausar rutinassecuencialesencadanodo.I/Oencadanodo. EXTRINSIC(HPF_SERIAL)Slounprocesadorcorrela rutina.

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.

Ademsdelamemoriacentralcompartida,cadahilotiene unavistatemporaldelamemoriacompartida (almacenamientotemporalprivado,cacheable)yunespacio privado(threadprivate),noaccesibledesdeotroshilos.

Siunhiloseconvierteenmasterdeunequipodehilos,sus variablesprivadassernvisiblesporsuequipoanoserquese declarendenuevoprivadas.

Lavistatemporaldelamemoriadelhilonotienequeser siempreconsistenteconlamemoriacentral.Sepuede asegurarestoconFLUSH.

OpenMP:Estructura.

OpenMPentraenunprogramaatravsde directivas,confuncionespropias(quepueden sercondicionalmentecompiladas)yvariablesde entorno,quetambinpuedenmodificarel comportamientoentiempodeejecucin Ejemplos:


!$OMPPARALLELDOPRIVATE !$NT=OMP_GET_NUM_THREADS() setenvOMP_NUM_THREADS8

Variablesdeentorno.

Establecidasenelshellquecomienzalaejecucin, ignoradasunavezhacomenzadosta.Lasvariables siempreenmaysculas,susargumentosdaigual.

OMP_SCHEDULE:Controlaladistribucindeltrabajoen losbucles.Puedeserstatic,dynamicoguidedy admiteunparmetronumricoqueespecifica,porejemplo, eltamaodebloquearepartirenunadistribucinesttica.


Elvalorporomisinesdependientedelaimplementacin. Ej.:setenvOMP_SCHEDULEstatic,100

OMP_NUM_THREADS:Controlaelnmerodehilosde ejecucinenlosqueseabreunareginparalela

OMP_DYNAMIC:Controladinmicamenteel nmerodehilosdeejecucinenlosqueseexpande unareginparalelaparamaximizarelusoderecursos. Puedesertrueofalse.Valorporomisin dependientedelaimplementacin. OMP_NESTED:trueofalseControlala expansindeunhilodeejecucinenunequipode hilosenregionesparalelasanidadas.Elvalorpor omisinesfalse.

Sepuedenalterarentiempodeejecucinlos comportamientosqueregulanestasvariablescon llamadasalalibrera.Ej.:omp_set_dynamic, omp_set_num_threads.

OpenMP:Directivas

Reginparalela:PARALLEL Distribucindetrabajo:DO,SECTIONS, SINGLE,WORKSHARE Sincronizacin:MASTER,CRITICAL, BARRIER,ATOMIC,FLUSH,ORDERED. Entornodedatos:THREADPRIVATE Alcancededatos:PRIVATE,SHARED, DEFAULT,FIRSTPRIVATE,LASTPRIVATE, REDUCTION,COPYIN

Reginparalela:
!$OMPPARALLEL[espec.[[,],espec.]...] [Bloquedecdigo] !$OMPENDPARALLEL

El[BloquedeCdigo]seejecutarporvarioshilos.No sepuedehacersaltosdeprogramadesde/haciael[Bloquede Cdigo] Haycualificadoresqueexplicitanelcomportamientodelas variablesdentrodelbloque:

(FIRST)PRIVATE(lista):Lasvariablesen(lista) sonprivadasacadahilo.Suinicializacinesalvalordela variableoriginalsiseusaFIRSTPRIVATE.

Losndicesdeunbuclesonconsideradoscomoprivados poromisin.

SHARED(lista):Lasvariablesen(lista)soncomunesatodos loshilos. REDUCTION((operador/intrnseco):lista): Realizaunaoperacindereduccinsobrelasvariablesen (lista)usandoeloperador/intrnsecobinarioespecificado.

Operador:Puedeser+,*,,.and.,.or.,.eqv., .neqv. IntrnsecopuedeserMAX,MIN,IAND,IOR, IEOR.

Alfinalizarunareginparalelahayunasincronizacinimplcita. Sloelhilomastercontinualaejecucin

Distribucindetrabajo:BuclesDo,seasignaun conjuntodeiteraciones(ndices)acadahilodisponible.
!$OMPDO[especificaciones] [BucleDo] !$OMPENDDO[NOWAIT]

ElmododedistribucinesmodificableconSCHEDULE. Seaplicantambin(FIRST)(LAST)PRIVATEyREDUCTION Alfinaldeladirectivadedistribucinhayunasincronizacin implcitaentrehilosquesepuedeevitarconNOWAIT.

DirectivaCOLLAPSEparareunirenunnicobucledos buclesanidadosyasidistribuirsucargademanerams eficiente(OpenMP3.0)

DistribucindeltrabajodentrodelosbuclesDo: SCHEDULE

STATIC(tamaodebloque)

Alaentradasegeneranbloquesdetrabajodeltamaoespecificadoy seasignanestticamenteacadahilodisponible. Alaentradasegeneranbloquesdetrabajodeltamaoespecificadoy sedejanenunpooldetrabajosdelquecadahilodisponibleva tomandotrabajo. Secreanbloqusdetrabajodetamaodecreciente (exponencialmente)comenzandoporeltamaomximoespecificado (OpenMP3.0)Eligeautomaticamenteentiempodeejecucinla mejoropcin.

DYNAMIC(tamaodebloque)

GUIDED(tamaoinicialdebloque)

AUTO

Distribucindetrabajo:Secciones:Cadabloquees ejecutadoporunsolohilo.
!$OMPSECTIONS[especificaciones] [bloquedecdigo] !$OMPSECTION [bloquedecdigo] .... !$OMPENDSECTIONS[NOWAIT]

Cada[bloquedecdigo]esejecutadoporunsolohilo (exceptosiincluyedirectivasPARALLELensuinterioren cuyocasoelhiloentrantepodraexpandirotroequipodehilos) Seaplicantambin(FIRST)(LAST)PRIVATEy REDUCTION

WORKSHAREreparteeltrabajoenunidadesde trabajoquesonejecutadasunasolavez.Ejemplosde unidadesdetrabajoson:

Lasevaluacionesdecadaelementodeunaexpresin matricial. Unaparticincualquieradetrabajodeunafuncin transformacionalsobreunamatriz:e.g.:MATMUL, MINLOC,...

TantoSECTIONScomoDOsesuelenagruparcon PARALLEL
!$OMPPARALLELSECTIONS [especificadores] !$OMPPARALLELDO[especificadores]

Hayunciertocontrolsobrequejecutacadahilo:

El[Bloquedecdigo]esejecutadoporunsolohilo:

!$OMPSINGLE[lista] [Bloquedecdigo] !$OMPENDSINGLE[NOWAIT]

El[Bloquedecdigo]esejecutadosoloporelhilomaster,
losdemssaltanelbloqueycontinuan.

!$OMPMASTER[lista] [Bloquedecdigo] !$OMPENDMASTER[NOWAIT]

El[Bloquedecdigo]esaccedidoporunsolohilocadavez. Cadahiloesperaalcomienzodelbloquehastaqueningunotro loestejecutando.

!$OMPCRITICAL[lista] [Bloquedecdigo]

!$OMPBARRIEREstableceunpuntodebarreraparalos hilosdeejecucin.

Slosonafectadosporsteloshilosdelequipodondeestsituadoel puntodebarrera.Porejemplo,unabarrerasituadadentrodelaregin msinternadeunareginparalelaanidadaenotraafectasloal equipodehilosqueestejecutandolaregininterna.

!$OMPATOMICAseguraqueunadeterminadaposicindela
memoriacompartidatieneaccesoexclusivosloporunhilocada vez.Serefiereatodosloshilosqueejecutanelprogramayactua slosobrelasentenciadeasignacininmediatamenteposteriorala declaracindeATOMIC.

!$OMPFLUSH(lista)Aseguraquecadahiloquese
encuentraestasentenciasincronizalosvaloresdelasvariablesen (lista)(sinoaparecenserefiereatodaslasvariablesnoprivadas delhilo)desuvistatemporalconlosvaloreslamemoriacentral compartida.

Algomssobrealcancededatos.

THREADPRIVATE[lista]haceque[lista]sea privadoacadahiloperoglobalesdentrodelhilo.

COPYIN[lista]hacequealcomienzodeunaregin paralelalosvaloresde[lista]delhilomaestrose copienalasvariablesprivadasdelrestodeloshilos.

LASTPRIVATE[lista]haceque[lista]se comportecomosihubiesesidodeclaradaPRIVATE, peroelltimohiloqueejecutalasentenciade distribucindeltrabajoactualizaconsuvalorprivadode [lista]elquehubieraantesdelconstructor.

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.

Sinembargosepuedehacerunprogramafuncionalcon6 llamadas:Inicio/Finalizacindelentorno,envio/recepcin bsicapuntoapuntoeidentificacindelosprocesosque tomanparteenelclculo. Otrascaractersticasimportantes:Criteriosdecomplecinde mensajes,gruposdeproceso,comunicacionescolectivas, topologas,tiposderivadosdedatos...

ComunicacionesenMPI

UnprogramaMPIesunconjuntodeprocesosquecolaboran enlaejecucindeunatarea.Lomsnormalesqueseael mismoprogramaejecutndoseenvariosnodos(modoSPMD).

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:

Dndecomienzanlosdatosaserenviados. Lalongituddelosdatos. Eltipo Elidentificadordelprocesoalqueseenvia. Elcomunicadoralquepertenecedichoidentificador Unmarcador(tag)queidentificaelmensaje,

TiposdeMensajes

Lasrutinasdecomunicacinpuedenser:

Bloqueantes:Lavueltadelarutinasignificaqueha completadolacomunicacin. Nobloqueantes:Larutinavuelveelcontrolinmediatamente, perohayquecomprobarsisehacompletado.

Queunacomunicacinsehayacompletadosignificaque lasdireccionesdelbufferpuedenseraccedidas.

Segnlascondicionesdecomplecinhaymsvariantes:

Sncrona:Elenviocompletacuandolarecepcincompleta. Buffered:Completacuandoelmensajesehacopiadoaunbuffer, independientementedesiserecibeono. Standard:Completacuandoelmensajeseenvia.Estadoderecepcin desconocido.

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

SeusanlasrutinasMPI_TYPE_... SedanaconoceralsistemaconMPI_TYPE_COMMIT Untipoderivadoesunobjetoqueespecificaunasecuencia detiposbsicosysusdesplazamientosotypemap. Hayrutinasparacreardirectamentetiposderivadosdeuso comncomovectores,submatrices,etc.

Gropp94

Ejemplo:Creacindeunasubmatriz.

MPI_TYPE_CREATE_SUBARRAY(NDims,ArraySizes, SubArraySizes,SubArrayStarts,Order, OldType,NewTypeIerror)

CreauntipoderivadoNewTypequeesunasubmatrizde NDimsdimensionesdetamaoSubArraySizes(1) SubArraySizes(2)deunamatrizdeNDimsdimensiones detamaoArraySizes(1)ArraySizes(2).La submatrizcomienzaenelelemento (SubArrayStarts(1),SubArrayStarts(2)).Order especificasielalmacenamientoesorientadoafilas(comoenC: MPI_ORDER_C)uorientadoacolumnas(comoenFortran: MPI_ORDER_FORTRAN).Losndicescomienzanencero.

ParaqueMPIacepte(yoptimice)NewType: CallMPI_TYPE_COMMIT(NewType,IError)

CreacindeTopologas

Adaptacinentrelatopologadelhardwareyla requeridaporlaaplicacin.

Ungrupodeprocesoperteneceaungrafogenrico,una redcartesianaoninguna. Existenfacilidadesespecialesparacrearuna descomposicincartesianadelosprocesos.Assepuede, atravsdeotrasllamadasespecficas:

Encontrarlascoordenadasenlareddelprocesoquehacela llamada. Conocercualessonlosprocesosorigenydestinoparahacer shiftsdedatoscondirecciones/desplazamientosdados.

I/OParalela

Defineelaccesodeunficheroavariosprocesosde maneraconcurrente,paraello:

Unprocesotieneaccesoaunficheroatravsdeuna vista.Distintosprocesospuedentenervistasdistintasdel mismofichero. Unavistavienedeterminadapor:

Desplazamiento:Posicindesdeelcomienzodelarchivo. Etype:Tipoelemental,unidadbsicadeaccesoalfichero.Puede seruntipobsicoMPIountipoderivado. Filetype:Mscaraparaaccederalarchivo.Compuestoporun etypeoporlaconcatenacindevariascopiasdelmismoetype.

Unavistaesunconjunto ordenadodetiposelementales (etype)ydefineelconjuntode datosdeunficherovisiblespor unproceso.Cadaproceso tienesupropiavistadel fichero,quevienedefinida porundesplazamiento,unetype yuntipodefichero.

Lusk97http://www.mpiforum.org/docs/

Creacinycontroldeprocesos.

MPIasumequeelsistemaproveeuninterfazquele permitearrancarprocesos(ej.:POE,rsh) LasrutinasbsicassonMPI_COMM_SPAWNy MPI_COMM_SPAWN_MULTIPLE,queproveenuninterfaz entreMPIyelentornodeejecucin.Arrancanun proceso(ovarios,nonecesariamenteiguales)y estableceunmecanismodecomunicacindevolviendo unintercomunicador.


MPI_COMM_WORLDtieneunnuevoatributo: MPI_UNIVERSE_SIZEquesirveparaestablecerlo

grandequepuedellegaraserelentornodeejecucin.

MecanismoRMA,todoslosparmetrosdela comunicacin,tantoparaenviocomorecepcin,son especificadosporelmismoproceso.

Comunicaccindirigidalocalmente (onesided)

Cuandounprocesosabetodolonecesarioparaaccedero actualizarunaposicindememoriaremotasinhacer necesarioqueelprocesoremotodebaconocerlotambin. PermiteelusodemecanismosHWparaacelerarlas comunicaciones(e.g.DMA)


MPI_PUT,MPI_GET,MPI_ACCUMULATEqueactuana

travsdeunaventana,queindicaqupartedelamemoria ydesdequprocesosestaccesible,quehayquecrearcon MPI_WIN_CREATE.

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

ycompartida. Alamemoriacompartidanoselasupone unaccesoidnticodesdecualquierhilo: Seestableceunaafinidadentredeterminadas seccionesdelamemoriaydeterminados hilos,loquepermitemantenerunacierta localidaddereferenciasparamejorarel rendimiento.

UPCsepretendequeseafcildeusar:Funcionacomouna extensinnodemasiadograndedeC.

NopresuponeunconocimientoexplcitodelHWdela mquina...aunquepretendefuncionarbienentodo, evidentementehayarquitecturasdondesecomportarmejor queenotras.

Sepretendequeseaeficiente:Permitecontrolarlalocalidad dereferenciascontrolandolaafinidadentrezonasdememoria ehilosdeejecucin.

Lalocalidadsecontrolamediantelasdeclaracionesdelas variables(puedeseradistintosniveles). Laescritura/lecturaremotasonbsicamentesentenciasde asignacin(yalgunasfunciones)

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.

MYTHREAD:Enteroconelnmerodendicequeidentificaelhiloqueestejecutando elcdigoenesemomento. THREADS:Nmerototaldehilosqueejecutanelprograma. UPC_MAX_BLOCK_SIZE:Tamaomximodelbloqueedememoriaarepartir

(dependientedelcompilador)

Declaracindevariables:
shared:Lavariableescompartida.Sinoseespecificanada,poromisinsonprivadas

yseasignanalamemoriadelhilo0.

Modelodeconsistenciadememoria:
strict:Losdatoscompartidossonsincronizadossiempreantesdecadanuevo

acceso.Siunhiloestaaccediendoaellos,losdemsdebenesperaraque termine.Elcompiladornoestautorizadoareordenarlosaccesosparasu optimizacin. relaxed:Loshilosnotienenningunarestriccindeacceso(modoporomisin).

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.

#include<upc_relaxed.h> strictsharedintcounter; voidmain(){ counter++; printf(Counternowshows%d\n,counter); }

Lavariablecounterenmodoestricto,todolo demsenrelajado.

Datoscompartidos.

shared[tamaobloque]tiponombrevariable Sinoseespecifica[tamaobloque]seasume[1],sise especifica[]seasumequetodovaalhilo0.


sharedintx[11];

inty; sharedintz; (sobre5hilos)

shared[2]intA[4][2];

(sobre3hilos)

Sincronizacin:

Barrerasbloqueantes:upc_barriercadahiloesperaa quetodoslosdemslleguenalpuntodesincronizacin.
... sharedinta=0; intb; intmain(){... do{ ACTUALIZAa } upc_barrier; b=a; ... }

Sinlabarreranohabragarantiadequelavariable privadabtuvieseelmismovalorquelavariable compartidaaentodosloshilos

Barrerasendosfases(nobloqueantes,splitphase):

upc_notifyid upc_waitid

upc_notifynotificaalrestodeloshilosqueha pasadoporallycontinuasuprocesohastaquese encuentraconelupc_waitcorrespondiente,donde cadahiloesperahastaquetodoslosdemshanpasado porelupc_notify.

Cerrojos:

voidupc_lock(upc_lock_t*lock) voidupc_unlock(upc_lock_t*lock)

intupc_lock_attempt(upc_lock_t*lock)Para evitaresperas:devuelve1sicierray0sinohapodido. upc_lock_free

Loscierrespuedensercreadoscolectivamente:La siguientellamadaesejecutadaportodosloshilosycreaun cerrojo(abierto).Todosloshilosrecibenelpuntero.

upc_lock_t*upc_all_lock_alloc(void)

Nocolectivo:Lallamadasololarealizaunhiloysoloel hiloqueloejecutarecibeelpuntero,anoserquela variablequelorecibahayasidodeclaradacompartida.

upc_lock_t*upc_global_lock_alloc(void)

Distribucindetrabajo:

upc_forall(i_inicial;condicin; incremento,i_afinidad) Laiteracinilarealizaelhiloporelquetieneafinidad: i%THREADS Ej:Trabajoasignadocclicamente:

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]; }

A[n][n]estdistribuidocclicamenteporfilas(unafilaporhilo,cclico). b[n]yx[n]estndistribuidoscclicamente(elementoaelemento). Enelupc_forallelaccesoserlocalab[i]yA[i][j]enlaiteracini.

Reservadinmicadememoria:

sharedvoid*upc_all_alloc(size_t nblocks,size_tnbytes)

Colectiva:Todosloshilosdebenhacerlallamadaconlos mismosargumentos.Cadahilorecibeunpunteroalamisma posicindememoria.

sharedvoid*upc_global_alloc(size_t nblocks,size_tnbytes)

Soloungrupodehiloshacelallamada.Sehacentantasreservas dememoriacomohiloshacenlallamada.Cadahilorecibeun punteroasupropiareserva.

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:

voidupc_all_broadcast(sharedvoid*dst, sharedconstvoid*src,size_tnbytes, upc_flag_tsync_mode);

sharedintA[THREADS]; sharedintB[THREADS]; //InitializeA. upc_barrier; upc_all_broadcast(B,&A[1],sizeof(int),UPC_IN_NOSYNC|UPC_OUT_NOSYNC); upc_barrier;

Otrosejemplosdefuncionescolectivasenlalibrera

voidupc_all_scatter(sharedvoid*dst, sharedconstvoid*src,size_tnbytes, upc_flag_tsync_mode); voidupc_all_gather(sharedvoid*dst, sharedconstvoid*src,size_t nbytes,upc_flag_tsync_mode); voidupc_all_gather_all(sharedvoid*dst, sharedconstvoid*src,size_tnbytes, upc_flag_tsync_mode);

Hayms,faltan:

Punterosprivados/compartidosapuntandoareasde memoriaprivada/compartidaysuaritmtica. I/Oparalela.

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:

TheOpenMPArchitectureReviewBoard.OpenMPFortran ApplicationProgramInterfaceVersion2.0Noviembre2000. Draft2.5Noviembre2004.http://www.openmp.org AA.VV.OpenMP:AProposedIndustryStandardAPIfor SharedMemoryProgramming,1997.http://www.openmp.org

AA.VV.RS/6000ScientificandTechnicalComputing:Power3 IntroductionandTuningGuide.IBMRedbooks,1998. http://www.redbooks.ibm.com AA.VV.OpenMP,aParallelProgrammingModelforShared MemoryArchitectures.EdinburghParallelComputingCentre, 1998.http://www.epcc.ed.ac.uk/epcctec/documents

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:

S.Chauvinetal.UPCManual(V1.2),TheGeorgeWashington University(2003) K.Yelicketal.AProposalforaUPCMemoryConsistency Model,v1.0LawrenceBerkeleyNationalLabTechReport LBNL54983,2004. HighPerformanceLaboratoryatGWUhttp://upc.gwu.edu/ BerkeleyUPCUnifiedParallelChttp://upc.lbl.gov/

You might also like