530 likes | 688 Views
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
E N D
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
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
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
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
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
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
Hello World Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Š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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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