300 likes | 489 Views
Uvod v MPI – 2. del Vzporedno programiranje s programsko knjižnico za prenos sporočil. Poglavje 8 – PP http://www-unix.mcs.anl.gov/mpi/. Preostala poglavja. Vzroki za nastanek Model prenosa sporočil Začetki in razvoj MPI , trenutno stanje Dodatne informacije o MPI , instalacija
E N D
Uvod v MPI – 2. delVzporedno programiranje s programsko knjižnico za prenos sporočil Poglavje 8 – PP http://www-unix.mcs.anl.gov/mpi/ Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Preostala poglavja • Vzroki za nastanek • Model prenosa sporočil • Začetki in razvoj MPI, trenutno stanje • Dodatne informacije o MPI, instalacija • Osnove MPI • Hello, World! • Osnovni koncepti • Enostavni primeri • Komunikacija vozlišče-vozlišče • Kolektivna komunikacija • Primer vzporednega programa za izračun števila Pi • Primer izpitnih obrazcev Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Tipi komunikacije - 1 • Ne blokirajoča: program se lahko vrne iz klicane komunikacijske funkcije preden se prenos podatkov zaključi in preden lahko uporabnik varno uporabi (ponovno) prenosne vire, kot npr. pomnilniški vmesnik za sporočilo, ki je bil specificiran v klicu. • Blokirajoča: program čaka v funkciji, da se leta izvede. Šele ko se program vrne iz komunikacijske rutine, se viri lahko varno ponovno uporabijo. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Tipi komunikacije - 2 • Lokalna: zaključek klica je odvisen le od lokalnega procesa, na primer ne blokirajoča oddaja. • Ne lokalna: zaključek klica je odvisen od izvedbe MPI funkcije v oddaljenem procesu, na primer blokirajoči sprejem bo čakal toliko časa, da bo sporočilo na oddaljenem viru oddano in lokalno sprejeto. • Vozlišče-vozlišče: ko v komunikaciji sodelujeta le dva procesa, na primer, ko eden odda drugi pa sprejme sporočilo. • Skupinska: ko sodeluje več procesov pri komunikaciji, in mora to skupinsko funkcijo izvesti več procesov, na primer eden-vsem. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Komunikacijski modeli • Sinhroni načinMPI_SSENDse ne konča preden se ne začne sprejem sporočila. • Z vmesnim pomnilnikom (buffered) načinMPI_BSENDponudi dovolj pomnilnika, da “unsafe” programi postanejo varni. • Način pripravljenosti (ready)MPI_RSENDgarantira da je bilo sporočilo dostavljeno v celoti. • Ne-blokirajoča komunikacija: MPI_ISEND, MPI_IBSEND,MPI_IRSEND, se vrne takoj po klicu. • Pri tem lahko MPI_RECVsprejme sporočilo, ki je bilo odposlano na katerikoli način. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
MPI-jeve ne blokirajoče komunikacije • Ne blokirajoča komunikacija se takoj vrne iz funkcije in ponudi kazalec (request handles) s katerim lahko testiramo trenutno stanje oddaje: MPI_ISEND(buf, count, datatype, dest, tag, comm,request) MPI_IRECV(buf, count, datatype, source, tag, comm,request) • Lahko čakamo, da se lahko oddajni pomnilniški vmesnik spet uporabi: MPI_WAIT(request, status) • ali pa testiramo stanje oddaje: MPI_TEST( request, flag, status) Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
MPI-jeve ne blokirajoče komunikacije • Ne blokirajoča oddaja MPI_ISEND, ki ji takoj sledi čakanje MPI_WAITje funkcionalno ekvivalentna blokirajoči oddajiMPI_SEND. • Kako izvedemo čakanje na končanje več funkcij(master/slave program, ko master proces čaka na sporočila od več slave procesov)? MPI_WAITALL(count, array_of_requests,array_of_statuses) MPI_WAITSOME( count, requests, ndone, indices,statuses) Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
MPI-jeve ne blokirajoče komunikacije • Če ne uporabljamo oddaje s pomnilniškim vmesnikom, lahko program čaka na končanje oddaje sporočila (problem, če so dolga sporočila in lahko tudi, če imamo mnogo kratkih sporočil). • Če bi lahko procesor med tem izvajal koristno računanje, lahko zelo skrajšamo izvajanje celotnega programa (prekrivanje komunikacije in računanja). Za uspešno izvedbo takega programa so potrebne izkušnje in testiranje časa izvajanja (meritve). Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Nedoločenost zaporedja sporočil • MPI funkcije oddaje in sprejema ne zagotavljajo določenosti zaporedja: na primer, vrstni red dospelih poročil iz dveh različnih virov, procesa A in B, v procesu C, ki sprejema, ni določen oz. vnaprej znan. • Uporabnik mora sam zagotoviti, da bo njegov program pravilno deloval in se ne bo zanašal na vrstni red sporočil. Če je vrstni red sporočil potreben, ga je treba zagotoviti s programom. Na primer, sprejeti obe sporočili in jih uporabiti po zahtevanem vrstnem redu. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Prehitevanje in pravičnost v MPI • MPI komunikacija je: • Brez prehitevanja: Če pošiljatelj pošlje dve sporočili istemu sprejemniku, bo sprejemnik prejel ti poročili v enakem vrstnem redu kot jih je oddajnik oddal. • Nepravična: Ne glede na to koliko časa mora nek proces oddaje čakati na izvedbo, ker je npr. komunikacijski vmesnik zaseden), vedno ga lahko prehiti nek drug proces, ki je čakal veliko manj. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_ BARRIER • Funkcije skupinske komunikacije morajo klicati vsi udeleženi procesi skupine, ki je določena s komunikatorjem comm. MPI_BARRIER (comm) • To funkcijo uporabimo za skupinsko časovno uskladitev (sinhronizacijo) izvajanja procesov v skupini, določeni s comm. • Vsi procesi čakajo, da se funkcija izvede v vseh preostalih procesih in se vrnejo iz funkcije, ko so prejeli potrditev od vseh preostalih procesov. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_ BARRIER MPI_BARRIER (comm) • Klic funkcije v vseh procesih je ekvivalenten pošiljanju praznega sporočila vsakemu vsem preostalim procesom ter sprejemanju size-1 sporočil v vsakem procesu (od vseh preostalih). • To lahko izvedemo, npr. s klici funkcij MPI_SENDRECV iz vsakega procesaza vseh preostalihsize-1 procesov: MPI_SENDRECV(sbuf, 0, stype, 0, stag,rbuf, 0, rtype, 1, rtag, comm, status); MPI_SENDRECV(sbuf, 0, stype, 0, stag,rbuf, 0, rtype, 2, rtag, comm, status); …. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_ BARRIER MPI_BARRIER (comm) • Programer mora zagotoviti, da bodo vsi procesi zares poklicali funkcijo MPI_BARRIER, ker bo sicer program blokiral. • Barrier (zapreka) je enostaven način za prehod iz ene faze računanja v drugo. Z njo zagotovimo, da se morebitna sporočila iz prve faze ne vmešavajo v izvajanje programa iz naslednje faze. • Toda ekspliciten klic te funkcije ni zaželen, ker je časovno potraten. Bolje je uporabljati značke (tags), naslove izvorov (sources) in skupin (contexts), tako da sploh ne pride do neželenih (neznanih) sporočil. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_BCAST MPI_BCAST(inoutbuf, cnt, type, root, comm) • Funkcija izvede komunikacijo eden-vsem, s tem, da le eden - korenski (root) - proces pošlje enake podatke vsem preostalim procesom size-1 v skupini, določeni s comm (ekvivalentno size-1 krat MPI_SEND(sbuf, cnt, type, pID, tag, comm)). • Vsi od preostalih procesov tudi pokličejo to funkcijo in z njo sprejmejo od root procesa sporočilo, opredeljeno v funkciji (ekvivalentno MPI_RECV(rbuf, cnt, type, root, tag, comm). Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_BCAST MPI_BCAST(inoutbuf, cnt, type, root, comm) • Ko se klic začne izvajati, je sporočilo shranjeno v vmesniku inoutbuf v root procesu in je sestavljeno iz cntpodatkovnih enot tipa, določenega s type. • Ko je funkcija končana v vseh procesih, je sporočilo multiplicirano v inoutbufvseh preostalih procesov. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_BCAST • MPI_BCAST(inoutbuf, cnt, type, root, comm) • Ker je inoutbufuporabljen kot vhodni (IN) parameter v root procesu in kot izhodni (OUT) parameter v vseh ostalih, ga označimo s tipom INOUT. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_GATHER, MPI_SCATTER • MPI_GATHER(sendbuf, sendcnt, sendtype, recvbuf, recvcnt, recvtype, root, comm) proces root zbere enako dolga sporočila incnt iz vseh procesov v skupini comm(tudi od sebe) in jih shrani na začetnem naslovu recvbuf,v zaporedju procesnih ID-jev in z dolžino size*recvcnt. Prvi trije parametri so relevantni za oddajo za vse procese, drugi trije pa za sprejem samo na root procesu. • Rezultat je ekvivalenten kot da bisizeprocesov izvršilo: MPI_SEND (sendbuf, sendcount, sendtype, root, tag, comm) root pa bi izvedel sizeklicev: MPI_RECV (recvbuf+pID*recvcnt*size(recvtype), recvcnt, recvtype, pID, tag, comm, status) Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_GATHER, MPI_SCATTER • MPI_SCATTER(inbuf, incnt, intype, outbuf, outcnt, outtype, root, comm) razdeli sestavljeno sporočilo iz root procesa vsem ostalim procesom, tako, da ga razdeli na size enakih delov, in vsakega od delov pošlje po zaporedju ID-jev vsem preostalim procesom (vključno sebi). Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_REDUCE, MPI_ALLREDUCE • MPI_REDUCE(inbuf,outbuf,count,type,op, root,comm) Funkcija na procesu root sprejme podatke iz vseh procesov v skupini comm in jih kombinira z enostavno računsko ali logično operacijo op. Proces z rankom root vrne rezultat v vmesniku outbuf. • Število in tip podatkov morata biti v vseh procesih enaka. • MPI_ALLREDUCE(inbuf, outbuf, count, type, op, comm) je vzporedna izvedba MPI_REDUCEv vseh procesih. Vsi uporabijo enake parametre, torej bodo imeli na konci vsi enak rezultat. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_ALLREDUCE • MPI_ALLREDUCE(inbuf, outbuf, count, type, op) bi lahko izvedli tudi z: MPI_REDUCE(inbuf,outbuf,count,type,op, root,comm) MPI_BCAST(outbuf, count, type, root, comm) • V mnogih numeričnih algoritmih, npr. pri računanju z vektorji in matrikami, lahko pare SEND/RECVzamenjamo s pari BCAST/REDUCE, s čimer povečamo učinkovitost in preglednost programa. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
MPI_REDUCE, MPI_ALLREDUCE Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Osnovne skupinske komunikacije v MPI - MPI_ALLREDUCE • MPI_REDUCE(inbuf,outbuf,count,type,op, root,comm) • MPI_ALLREDUCE(inbuf, outbuf, count, type, op) • Možne že vgrajene računsko/logične operacije so: • Maksimum in minimum (MPI_MAXinMPI_MIN); • Vsota in produkt (MPI_SUMinMPI_PROD); • Logični IN, ALI, ekskluzivni ALI ( MPI_LAND, MPI_LOR, inMPI_LXOR); • Bitni IN, ALI, ekskluzivni ALI ( MPI_BAND, MPI_BOR, inMPI_BXOR); • Dodatno lahko definiramo tudi svoje lastne operacije. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
16 funkcij poenostavljenega MPI Osnovne funkcije: • MPI_INIT, MPI_FINALIZE, • MPI_COMM_SIZE, MPI_COMM_RANK, • MPI_SEND, MPI_RECV,MPI_SENDRECV Skupinska komunikacija: • MPI_BARRIER, • MPI_BCAST,MPI_GATHER, MPI_SCATTER • MPI_REDUCE,MPI_ALLREDUCE Kontrolne funkcije: • MPI_WTIME, MPI_STATUS, MPI_INITIALIZED • MPI_GET_COUNT • Je potrebno še kaj (zakaj)? Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Primer: Računanje PI - 0 1 |4/(1+x2) = 0 Če je n število intervalov, je numerično izračunan določeni integral enak vsoti n delnih vsot: (1/n)* [4/(1+x2i) ] za x = (1/n) * (i - 0.5) in i = (1…n), kar je enako približni vrednosti števila . Na sliki: n=5; 1/n=1/5=0.2 x=0.1, 0.3, 0.5, 0.7, 0.9 Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Primer: Računanje PI - 0 1 |4/(1+x2) = 0 Če je p število procesorjev lahko numerično integriranje opravijo vzporedno in sicer vsak s svojim pod-intervalom, tako da je i=myid+1, i+p, i+2p, … in i<=n. Vsak procesor računa vsak p-ti interval. Na vsakem dobimo rezultat s tremi (P1) in dvema (P2) delnima vsotama. Globalna vsota je enaka približni vrednosti števila . Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Primer: Računanje PI - 1 #include "mpi.h" #include <math.h> int main(int argc, char *argv[]) {int done = 0, n, myid, numprocs, i, rc;double PI25DT = 3.141592653589793238462643;double mypi, pi, h, sum, x, a;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myid);while (!done) { if (myid == 0) { printf("Enter the number of intervals: (0 quits) "); scanf("%d",&n); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); if (n == 0) break; Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Primer: Računanje PI -2 h = 1.0 / (double)n;sum = 0.0;for (i = myid + 1; i <= n; i += numprocs) { x = h * ((double)i - 0.5); sum += 4.0 / (1.0 + x*x); } mypi = h * sum; MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (myid == 0) printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));}MPI_Finalize(); return 0; } Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
VS 2011/12 – DN2 Rezultate To datoteko z izpolnjeno tabelo mi jo pošljite na moj e-naslov (roman.trobec@ijs.si) do 25. 1. 2013 do 16h. Rešitev, ki bodo prispele kasneje ne bom upošteval. Imenu datoteke, ki naj bo v prilogi, dodajte svoj ime_priimek. Odposlana tabela z rezultati DN2 (tudi če je prazna), je pogoj za opravljanje izpita v 1. in 2. roku (31.1 in 14.2). Ocena za DN2 je od 0-30% deleža v izpitni oceni. Ocena DN1 bo prispevala do 15% (vsi, ki sem jim sprejel DN1 imajo 10%, tisti, ki so predstavili rezultate imajo 15%. Kriterij za končno izpitno oceno: 6 > 66%; 7 > 74%; 8 > 82%; 9 > 90%; 10 > 95%; ocena vaj: izpitna ocena ± 1 Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Izpit – primer izpitnih vprašanj Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
Izpit – primer izpitnega obrazca Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13