1 / 53

Uvod v MPI - 1. del Vzporedno programiranje s programsko knjižnico za prenos sporočil

Uvod v MPI - 1. del Vzporedno programiranje s programsko knjižnico za prenos sporočil. Poglavje 8 – PP http://www-unix.mcs.anl.gov/mpi/. Povzetek. Vzroki za nastanek Model prenosa sporočil Začetki in razvoj MPI , trenutno stanje Dodatne informacije o MPI , instalacija Osnove MPI

Télécharger la présentation

Uvod v MPI - 1. del Vzporedno programiranje s programsko knjižnico za prenos sporočil

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Uvod v MPI - 1. 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

  2. Povzetek • 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 proces-proces • Kolektivna komunikacija Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  3. Message-Passing model • procespomeni (v klasičnem modelu) programski števec, ki kaže na inštrukcije programa v pomnilniškem prostoru, ki ga proces lahko naslavlja. • Na enem CPU-ju je lahko več procesov. Njihovo komunikacijo upravlja operacijski sistem. • Proces ima lahko več niti(threads) (programski števec in pripadajoči sklad spremenljivk), ki si delijo skupen pomnilniški prostor in preko njega tudi komunicirajo. • MPI omogoča standardizirano komunikacijo med procesi, neodvisno od operacijskega sistema. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  4. Kaj je MPI? • Opis (specifikacija) načina komunikacije s sporočili (message-passing library) • to ni programski jezik ali prevajalnik • tudi ni produkt ali programski paket • obstaja več različnih izvedb (prosto dostopnih in licenčnih) • Uporabna je za vzporedne in porazdeljene sisteme (homogene ali heterogene) • Je dobro vzdrževana – MPI forum • Zasnovana je za izvajanje na sodobni strojni opremi za • končne uporabnike • razvijalce programskih knjižnic • razvijalce programskih orodji Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  5. MPI informacije • Dokumentacija o standardu je dostopna na: http://www.mpi-forum.org vse uradne MPI verzije standarda (pdf, HTML) • Ostale koristne informacije na Web: http://www-unix.mcs.anl.gov/mpi/ • Online primeri in vaje za naša predavanja:http://www-unix.mcs.anl.gov/mpi/tutorial/mpiexmpl/contents.html Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  6. MPI viri • Online primeri in vaje za naša predavanja:http://www-unix.mcs.anl.gov/mpi/tutorial/mpiexmpl/src/hellow/C/main.html Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  7. Hello World Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  8. Je MPI obsežen? • MPI ima okrog (130funkcij) • Ima veliko funkcionalnost • Število funkcij ni nujno merilo zahtevnosti • MPI je lahko majhen (6 funkcij) • Dosti vzporednih programov lahko napišemo že s šestimi osnovnimi funkcijami. • MPI po naši meri (okrog 20 funkcij) • S tem bomo dosegli ustrezno zmogljivost in fleksibilnost. • Ni treba, da obvladamo celoten MPI, da bi ga lahko koristno uporabljali. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  9. Parametri MPI funkcij • Standard MPI je neodvisen od programskih jezikov. Kadar bomo opisovali standard bomo uporabljali velike črke. • Parametri, ki jih funkcije uporabijo, toda ne spreminjajo (vhodni parametri - IN) niso podčrtani. MPI_FUNKCIJA (par1) • Parametri, ki pa jih funkcija ne potrebuje, jih pa lahko spremeni (izhodni parametri – OUT) so podčrtani. MPI_FUNKCIJA (par1, par2) • Parametri, ki jih MPI funkcija lahko uporabi in hkrati spremeni (vhodno/izhodni – INOUT) so podčrtani in zapisani poševno. MPI_FUNKCIJA (par1, par2, par3) Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  10. Uporaba sprogramskim jezikom C • Pri C-ju so imena funkcij enaka kot v standardu, s tem da so prefix MPI_in prva črka imena funkcije napisana z velikimi črkami, na primer: MPI_Finalize(); • Funkcije vračajo status izvedbe v obliki celih števil (integers). Primer statusa je na primer informacija o napaki MPI_ERROR ali uspehu MPI_SUCCESS. • Tudi druge konstante so po dogovoru vse pisane z velikimi črkami in definirane v datoteki mpi.h, ki mora biti vključena v vsak program, ki uporablja MPI knjižnico #include "mpi.h” Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  11. Uporaba sprogramskim jezikom C • Funkcijski parametri tipa IN (to kar funkcija potrebuje za delovanje) se prenašajo z vrednostmi, • Funkcijski parametri tipa OUTin tipa INOUT (to kar funkcija vrača kot rezultat) se prenašajo z naslovi (kot kazalci): MPI_Comm_size(comm, &size ); • Spremenljivke statusa imajo svoj tip MPI_Status, ki je struktura s poljema status.MPI_SOURCEin status.MPI_TAG, ki vsebujeta informacijo o izvoru in znački sporočila. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  12. Data Types - C, Fortran • MPI podatkovni tipi so definirani za vsak C podatkovni tip: MPI_CHAR, MPI_INT, MPI_FLOAT, MPI_UNSIGNED_CHAR, MPI_UNSIGNED, MPI_UNSIGNED_LONG, MPI_LONG, MPI_DOUBLE, MPI_LONG_DOUBLE, itd. • In tudi za Fortran-ske podatkovne tipe: MPI_CHARACTER, MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISION, MPI_COMPLEX, MPI_LOGICAL, itd. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  13. Obravnava napak • MPI ne nudi in ne predpisuje nobenega načina za ugotavljanje procesorskih in komunikacijskih napak in reakcije nanje. • MPI program zato lahko preneha delovati npr. zaradi nepravilnih parametrov v MPI klicu, ali zaradi napake na računalniških virih, npr. prekoračitev pomnilnika, itd. • Po dogovoru (by default), taka napaka povzroči prenehanje delovanja (abort) vseh procesov povezanih z MPI, razen, če • Uporabnik določi, da te napake niso usodne (fatal) in obravnava kode napak, ki jih vračajo MPI klici, s svojim posebnim programom (npr. izpisovanje sporočil in navodil). Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  14. Preiskovanje okolja • Vsak program potrebuje neke funkcije, ki kontrolirajo zagon in zaustavitev aktivnosti programa na vseh procesorjih. • Poleg tega mora vsak proces že v začetku dobiti odgovora na dve pomembni vprašanji: Koliko procesov bo sodelovalo pri izvajanju programa? Kdo sem jaz? • MPI ima posebne funkcije za ta opravila. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  15. Osnovne MPI funkcije – zagon in ustavitev • MPI_INIT(int argc, char *argv[ ]) Omogoči začetek izvajanja programa. argc inargv sta potrebna samo zaradi kompatibilnosti s programskim jezikom C, in sta argumenta glavnega programa (main). • MPI_FINALIZE() Ta funkcija zaključi izvajanje programa. Pred MPI_INITali zaMPI_FINALIZEne moremo klicati nobene druge MPI funkcije, razen edine izjeme MPI_INITIALIZED(flag), ki poizve, če je bila že klicana funkcija MPI_INIT. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  16. Najmanjši MPI Program (C) #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { MPI_Init( &argc, &argv ); printf( "Hello, world!\n" ); MPI_Finalize(); return 0; } • #include "mpi.h"nam da osnovne MPI definicije in tipe, stdio.h je potreben zaradi funkcije printf, ki izpiše besedilo. • MPI_Initpožene MPI, MPI_Finalizezaključi MPI in izstopi iz njega. • Število procesov določimo z načinom zagona MPI (mpirun -np 5 hello) • Vse ne-MPI rutine, ki jih kliče program, morajo biti dostopne lokalno npr.: printf, zato se boHello, worldizpisal iz vsakega procesa. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  17. Naslednje nujno potrebne MPI funkcije • MPI_COMM_SIZE(comm, size ) Vrne število procesov, ki bodo sodelovali pri računanju. comm- komunikator (okolje,skupina); size n- število procesov v izbrani skupini (skupin je lahko več). Če jecommMPI_COMM_WORLD, potem je to število vseh aktivnih procesov. • MPI_COMM_RANK(comm, pid ) Vrne identifikacijsko številko procesa v katerem smo klicali to funkcijo. comm- komunikator; pidje ID procesa v skupini commin je lahko od 0dosize-1. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  18. Izpopolnjen Hello World (C) #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { int rank, size; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); printf( "I am %d of %d\n", rank, size ); MPI_Finalize(); return 0; } • Če je procesov 10 in vsi lahko izpisujejo, lahko pričakujemo size=10vrstic (rank = 0:9): >I am 1 of 10 >I am 0 of 10, >I am 5 of 10, … Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  19. Message-Passing model • Medprocesna komunikacija je sestavljena iz • Sinhronizacije (uskladitve sodelujočih procesov) in • Prenosa podatkov iz pomnilniškega prostora prvega procesa v pomnilniški prostor drugega procesa. • Sinhronizacija med procesi se izvede s parom Pošlji – Sprejmi. • Oba procesa se morata zavedati oddaje in sprejema sporočila. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  20. Process 0 Process 1 Send(data) Receive(data) MPI Send/Receive • Medprocesna komunikacija je bistvo MPI zato si jo bomo pogledali malo podrobneje. • Pri tem moramo specificirati: • Kako bodo “data” opisani? • Kateri proces je izvor podatkov ? • Kako bo proces vedel, da so podatki zanj? • Kdaj bo proces prenosa končan? Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  21. Data Data Data May I Send? Data Data Data Yes, go! Kaj v resnici pomeni prenos sporočila? Process 0 • Prenos podatkov in sinhronizacijo Process 1 Time • Torej prenos potrebuje sodelovanje izvornega (oddaja) in ponornega (sprejem) procesa. • To sodelovanje v programski kodi ni vedno očitno, ga moramo najti in razumeti. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  22. Osnovni MPI Send (blokirajoč) MPI_SEND (buf, count, datatype, dest, tag, comm) • Podatkovni vmesnik (buffer)je opisan z (buf, count, datatype). • Ponorni proces – sprejemnik je določen z dest, ki je ID (rank)sprejemnika v okviru grupe procesov definirane s comm. Sporočilo ima še dodatno identifikacijo (ovojnico) tag. • Ta funkcija je blokirajoča v smislu, da se v splošnem ne bo končala, dokler naslovnik ne bo izpraznil vmesnika sporočila. • Ko se funkcija Send konča, so podatki že predani operacijskemu sistemu, ki jih najbrž preko DMA-ja oddaja na komunikacijski vmesnik in fizični komunikacijski kanal. • Podatkovni vmesnik sporočila se lahko uporabi za naslednjo oddajo. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  23. Osnovni MPI Receive (blokirajoč) MPI_RECV(buf,count,datatype,source,tag,comm,status) • Čaka dokler ustrezeno sporočilo (gledesource, tag in comm) ni sprejeto od operacijskega sistema v podatkovni vmesnik buf. • sourcemora biti enak ID-ju (ranku oddajnika) v komunikatorju definiranem zcomm, ali pa je definiran kot MPI_ANY_SOURCE. • Če sprejemnik sprejme count>=0podatkovnih enot tipa datatypeje v redu, če pa jih sprejme več, je to napaka. • statusvsebuje podrobnejšo informacijo o končanem sprejemu (napaki ali uspehu). Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  24. Šest osnovnih MPI funkcij • Mnogo vzporednih programov lahko napišemo samo s temi šestimi funkcijami, od katerih sta le dve zahtevnejši: • MPI_INIT • MPI_FINALIZE • MPI_COMM_SIZE • MPI_COMM_RANK • MPI_SEND • MPI_RECV • Vozlišče-vozlišče (Point-to-point) komunikacija s (send/recv) ni edini način komunikacije. MPI podpira še celo paleto drugih. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  25. Process 0 Recv(1) Send(1) Process 1 Recv(0) Send(0) Deadlock • Če nek proces kliče MPI_RECV, bo potrpežljivo čakal na sporočilo, dokler ne bo nek drugi proces poslal sporočila z MPI_ SEND. • Če sporočila ne bo, bo sprejemnik čakal za vedno. • Praktično to pomeni, da se bo izvajanje našega programa prekinilo, ker bo time-out povzročil prekinitev. • Podobno bo, če bosta dva različna procesa istočasno klicala MPI_RECV, tudi sedaj bo lahko prišlo do neskončnega čakanja. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  26. Process 0 Send(1) Recv(1) Process 1 Send(0) Recv(0) Nadaljnji vzroki za Deadlock • Če kličemoMPI_SENDna dveh raličnih procesih hkrati, se ne bosta zaključila, če sta funkciji izvedeni brez pomnilniških vmesnikov (bufferjev), kar MPI standard v splošnem predvideva (najslabši primer). • Če staMPI_SENDizvedena z vmesnim pomnilnikom se lahko končata takoj in program nadaljuje z izvajanjem. Tu bo navidez vse v redu, do takrat, ko bodo vmesniki dovolj veliki za celo sporočilo. • Tak program se imenuje nezanesljiv (unsafe). Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  27. Primer • Če jeMPI_SENDizveden brez pomnilniških vmesnikov – deadlock, sicer OK, ker sta sporočili kratki. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  28. Nekaj možnih rešitev za “unsafe” programe Process 0 Send(1) Recv(1) Process 1 Recv(0) Send(0) • Pazimo lahko na vrstni red funkcij • Omogočimo pomnilniški vmesnik s funkcijoz uporabo MPI_BSEND (več pomnilnika, več časa!). Ali pa z uporabo posebne funkcije, ki podpira dvosmerno izmenjavo podatkov: MPI_SENDRECV • Uporaba ne-blokirajočih funkcij MPI_ISEND, MPI_IRECV in testiranjem konca prenosa z MPI_WAITALL, Process 1 Sendrecv(0) Process 0 Sendrecv(1) Process 0 Isend(1) Irecv(1) Waitall Process 1 Isend(0) Irecv(0) Waitall Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  29. MPI Send + Receive • Če bi uporabili blokirajoča Send/Receive bi bilo treba paziti na zaporedje (npr. procesi s sodim ID najprej pošiljajo, potem sprejemajo; z lihim pa najprej sprejemajo potem pošiljajo), da bi preprečili ciklične odvisnosti, ki lahko vodijo v popolno zaustavitev (deadlock). Primer za enosmerno prenašanje sporočil v verigi procesov: • PriMPI_SENDRECVprevzame odgovornost za pravilno izvedbo komunikacijski sistem (pomnilniški vmesnik). • varianta funkcije: MPI_SENDRECV_REPLACE, je blokirajoča, toda uporabi le en pom. vmesnik za obe sporočili. MPI_SEND MPI_RECV MPI_RECV MPI_SEND MPI_SEND MPI_RECV Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  30. MPI Send-receive • MPI_SENDRECV(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype, source, recvtag, comm, status) Ta funkcija je kombinacija prejšnjih dveh, zahteva prenos sporočila v sendbufprocesu destin sprejem drugega sporočila recvbuf iz drugega procesa source. Avtomatsko se rezervirata (alocirata) pom. vmesnika za oddajo in za sprejem. Oddaja in sprejem tečeta sočasno. • Ta funkcija je uporabna za enosmerno posredovanje sporočil po obroču procesov. MPI_SENDRECV MPI_SENDRECV MPI_SENDRECV Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  31. MPI_SENDRECV v C-ju To je “varna” verzija našega prejšnjega programa. Oddajamo desnemu sosedu in sprejemamo od levega soseda. Funkcija potrebuje več pomnilnika. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  32. Informacija o izvedbi komunikacije • statusje podatkovna struktura, ki jo alociramo v našem uporabniškem programu. • V programskem jeziku C: int recvd_tag, recvd_from, recvd_count; MPI_Status status; /* rezervira pomnilniški prostor za trenutni status sprejema*/ MPI_Recv(..., MPI_ANY_SOURCE, MPI_ANY_TAG,...,&status) recvd_tag = status.MPI_TAG; recvd_from = status.MPI_SOURCE; /*osnovna uporaba v primerih ko imamoMPI_ANY_TAGin/aliMPI_ANY_SOURCEpri sprejemu*/ MPI_Get_count( &status, datatype, &recvd_count); /* za določitev števila doslej prispelih podatkov trenutno izvajajočega se prenosa. */ Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  33. MPI podatkovni tipi • Ker MPI ne zahteva, da komunicirajoči procesi uporabljajo enake standarde za predstavitev tipov, mora sam poskrbeti za prevedbo v interne MPI tipe, ki jih bosta razumela oba procesa, čeprav se bosta izvajala na različnih platformah. • Obstajajo funkcije, ki lahko konstruirajo tudi lastne podatkovne tipe kot so matrike (int, float) parov,ali vrstice matrik, ki so shranjene v stolpcih, itd. • Dokler vemo koliko je naših podatkov, jih lahko vse prenašamo samo z MPI_BYTE. • Bolj udobno je uporabljati ekvivalentne MPI tipe, toda tudi časovno bolj potratno. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  34. MPI etiketa (tag) • Oznake MPI sporočil (etikete) so dodaten mehanizem - poleg izvora - za ločevanje sporočil. • Tag je celo število iz intervala [0, UB] kjer je UB zgornja meja, ki je določena s konstanto MPI_TAG_UB. • Sporočila imajo različne etikete, če sprejemni proces ločuje med več vrstami sporočil, ki so vsa namenjena njemu. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  35. MPI etiketa (tag) • Za odločitev, da je sporočilo namenjeno nekemu procesu, se mora ujemati celotna ovojnica (dest/source, datatype, tag and communicator). • Sporočila se lahko sprejemajo od določenega izvora, ne glede na vrednost etikete z uporabo MPI_ANY_TAGnamesto etikete, kasneje se pa v sprejemnem procesu sortirajo. • Če je na primer zahtevano, da se sprejmejo vsa sporočila, ne glede na izvor, lahko za izvor v MPI_RECVuporabimo konstanto MPI_ANY_SOURCE. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  36. MPI Timer • Pogosto v programih merimo čas izvajanja ali komunikacije. Čas med dvema točkama v programu dobimo z dvema klicema funkcija MPI_WTIME(), ki nam vsakič vrne trenutni čas (v neki resoluciji, npr. 0.1 milisekunde. Višjo resolucijo lahko dobimo s klicem sistemske funkcije). double t1, t2; t1 = MPI_Wtime(); … ... Program … t2 = MPI_Wtime(); printf( "Elapsed time is %f\n", t2 - t1); Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  37. Meritev pasovne širine komunikacije- 0 Processor 1 Rank 0 Processor 2 Rank 1 1,2, ,…… C doubles nloop times time tw ts length Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  38. Meritev pasovne širine komunikacije- 1 #include <stdio.h> #include <stdlib.h> #include "mpi.h" #define NUMBER_OF_TESTS 5 /* Number of tests for more reliable average.*/ int main( argc, argv ) int argc; char **argv; { double *buf; int rank, numprocs; int n; double t1, t2, tmin; int j, k, nloop; MPI_Status status; MPI_Init( &argc, &argv ); Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  39. Meritev pasovne širine komunikacije- 2 MPI_Comm_size(MPI_COMM_WORLD,&numprocs); if (numprocs != 2) { printf("The number of processes has to be two!\n"); return(0); } MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) printf( "Kind\t\tn\ttime (sec)\tRate (Mb/sec)\n"); for (n=1; n<110000; n*=2) { /* Message lengths doubles each time */ if (n == 0) nloop = 100; else nloop = 100/n; if (nloop < 1) nloop = 1; buf = (double *) malloc( n * sizeof(double) ); if (!buf) { fprintf( stderr, "Could not allocate send/recv buffer of size %d\n", n ); MPI_Abort( MPI_COMM_WORLD, 1 ); } Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  40. Meritev pasovne širine komunikacije- 3 tmin = 1000; for (k=0; k<NUMBER_OF_TESTS; k++) { if (rank == 0) { /* Make sure both processes are ready */ MPI_SendRecv( MPI_BOTTOM, 0, MPI_INT, 1, 14, MPI_BOTTOM,0,MPI_INT,1,14,MPI_COMM_WORLD,&status); /*MPI standard specifies that MPI_BOTTOM can be used in initialization expressions in C – in our case an empty buffer */ t1 = MPI_Wtime(); for (j=0; j<nloop; j++) {/*Send message nloop times.*/ MPI_Send( buf, n, MPI_DOUBLE, 1, k, MPI_COMM_WORLD ); MPI_Recv( buf, n, MPI_DOUBLE, 1, k, MPI_COMM_WORLD, &status ); } t2 = (MPI_Wtime() - t1) / nloop; if (t2 < tmin) tmin = t2; } else if (rank == 1) { /* Make sure both processes are ready */ Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  41. Meritev pasovne širine komunikacije- 4 MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, 0, 14, MPI_BOTTOM, 0,MPI_INT, 0,14, MPI_COMM_WORLD,&status); for (j=0; j<nloop; j++) { MPI_Recv(buf,n,MPI_DOUBLE,0,k, MPI_COMM_WORLD, &status ); MPI_Send( buf, n, MPI_DOUBLE, 0, k, MPI_COMM_WORLD ); } } } /* Convert to half the round-trip time */ tmin = tmin / 2.0; if (rank == 0) { double rate; if(tmin>0) rate=n*sizeof(double)*1.0e-6*8/tmin;/*in Mb/sec*/ else rate = 0.0; printf( "Send/Recv\t%d\t%f\t%f\n", n, tmin, rate ); } free( buf );} MPI_Finalize( ); return 0; } Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  42. MPICH - MPI v Unix in Linux okolju • MPICH je ena od prenosljivih izvedb MPI, prosto dostopna, vzdrževana na Aragonne national Laboratory. (Obstajajo še druge izvedbe: LAM, ...) • Knjižnica teče MPP's, računalniških skupkih, in heterogenih mrežah delovnih postaj. • V primeru da paketi niso nameščeni na OS jih namestite s pomočjo: • sudo apt-get install mpich2 (za distribucije ki temeljijo na Debianu) • V veliki večini Linux okolji bodo delovali ukazi: mpicc.mpich2–o myprog myprog.c mpd & mpirun.mpich2 -np 10 ./myprog Za prevajanje in zagon vašega programa na npr. 10 procesih. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  43. Izvajanje na enem računalniku • Če je na razpolago samo en računalnik, kar je primer v času, ko razvijate program, potem se vsi procesi izvajajo na enem procesorju in komunikacija poteka preko lokalnega pomnilnika. • Program prevedemo in ga zaženemo enako z želenim številom procesorjev. • Konfiguracijska datoteka je na standardnem direktoriju/etc/mpich/machines.local in vsebuje naslednje vrstice: localhost localhost .... localhost Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  44. Izvajanje na enem računalniku • Program izvajamo in testiramo, v začetni fazi, na enem procesorju. • Urejamo npr. z: vi first.c • Prevajanje in povezovanje (linkanje): mpicc.mpich2 -o first first.c /*first – izvedljiva datotekain first.o - objektnadatoteka*/ • Izvajanje: mpirun.mpich2 -np 2 ./first/*”Hello, world!” se izpiše dvakrat iz enega procesorja, če je program first.c hello.c */ Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  45. Izvajanje na računalniški mreži • Postopek je podoben, le da se bodo procesi sedaj zagnali vzporedno, na različnih računalnikih. • Konfiguracijska datoteka na računalniku z imenom kocka1 je: /etc/mpich/machines.LINUX • In vsebuje imena računalnikov, ki so povezani v mrežo, npr: kocka1 kocka2 kocka3 kocka4 itd., vsako v svoji vrstici, pri tem da prvo ime pripada lokalnemu računalniku. Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  46. Izvajanje na računalniški mreži • Sedaj lahko program, ki ste ga razvili na enem računalniku in vam deluje z več procesi, testirate tudi na več računalnikih. Zagon programa za upravljanje mpich procesov: mpd & • Urejanje: vi first.c • Prevajanje: mpicc.mpich2 -o first first.c/*first –executable in first.o - objektnadatoteka , obe shranjeni na skupnem disku.*/ • Zagon: mpirun.mpich2 -np 3 ./first/*Izpiše se trikrat “Hello, world!” iz različnih računalnikov, vsak na svojem terminalu*/ ali mpirun.mpich2 -machinefile /etc/mpich/machines.LINUX -np 2 ./hello Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  47. Izvajanje na računalniškem skupku • Na primer na skupku Ninestein na IJS, ki je sestavljen iz 4x36 processorjev:ninestein.ijs.si, bi uporabili naslednji postopek: • Login: Username: Password: • FTP vaš program prenesete v shome direktorij: scp first.c username@ninestein.ijs.si: • Uporabite npr. putty za terminalni dostop do kocke. • Zaženete program za upravljanje mpich procesov: mpd & • Urejate in prevajate na način, ki smo ga že spoznali: mpicc.mpich2 -o first first.c • Izvajate: mpirun -np 9 ./first/*npr. na devetih kockah, bo rezultat “Hello, world! Ki se bo sedaj izpisal le v vašem terminalnem oknu*/ Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  48. Windows: VISUAL C++ 2008 + MPICH2 • Prenesi in namesti MPICH2: • http://www.mpich.org/downloads/ • Prenesi in namesti Visual C++ 2008 iz (datoteka vcsetup.exe): http://www.microsoft.com/en-us/download/details.aspx?id=14597 • Zaženi Visual C++ 2008 in odpri projekt: C:\Program Files\MPICH2\examples\cpi.vcproj • Prevedi: C:\Program Files\MPICH2\examples\cpi.cz uporabo obstoječega Visual C projekta. • Poženi deamon proces iz ukaznega okna: “C:\Program Files\MPICH2\bin\smpd.exe -d” • Poženi mpiexec.exe proces iz ukaznega okna: cd “C:\Program Files\MPICH2\bin\” mpiexec.exe -n 1 “..\examples\Debug\cpi.exe” Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  49. Windows: MPICH2 • Prenesi in shrani MPICH2 (binary 32bits for Windows): http://www.mpich.org/downloads/ • Namesti MPICH2 Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

  50. Windows: VISUAL C++ 2008 • Prenesi in shrani Visual C++ 2008 iz: http://www.microsoft.com/en-us/download/details.aspx?id=14597 • Namesti Visual C++ 2008 Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13

More Related