Upload
madison-harrington
View
47
Download
4
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 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
• proces pomeni (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 (130 funkcij) – 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 s programskim 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 s programskim jezikom C
• Funkcijski parametri tipa IN (to kar funkcija potrebuje za delovanje) se prenašajo z vrednostmi,
• Funkcijski parametri tipa OUT in 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_SOURCE in 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 in argv 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_INIT ali za MPI_FINALIZE ne 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_Init požene MPI, MPI_Finalize zaključ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 bo Hello, world izpisal 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 je comm MPI_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;
pid je ID procesa v skupini comm in je lahko od 0 do size-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=10 vrstic (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
• 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?
MPI Send/Receive
Process 0 Process 1
Send(data)
Receive(data)
Data
DataData
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 21
Data
Kaj v resnici pomeni prenos sporočila?
• Prenos podatkov in sinhronizacijo
• Torej prenos potrebuje sodelovanje izvornega (oddaja) in ponornega (sprejem) procesa.
• To sodelovanje v programski kodi ni vedno očitno, ga moramo najti in razumeti.
DataProcess 0
Process 1
May I Send?
Yes, go!
Data
Time
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 (glede source, tag in comm) ni sprejeto od operacijskega sistema v podatkovni vmesnik buf.
• source mora biti enak ID-ju (ranku oddajnika) v komunikatorju definiranem z comm, ali pa je definiran kot MPI_ANY_SOURCE.
• Če sprejemnik sprejme count>=0 podatkovnih enot tipa datatype je v redu, če pa jih sprejme več, je to napaka.
• status vsebuje 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
• Č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.
Deadlock
Process 0
Recv(1)Send(1)
Process 1
Recv(0)Send(0)
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 26
• Če kličemo MPI_SEND na 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 sta MPI_SEND izvedena 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.
Nadaljnji vzroki za Deadlock
Process 0
Send(1)Recv(1)
Process 1
Send(0)Recv(0)
• Tak program se imenuje nezanesljiv (unsafe).
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 27
Primer
• Če je MPI_SEND izveden 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
• Pazimo lahko na vrstni red funkcij
• Omogočimo pomnilniški vmesnik s funkcijo z uporabo MPI_BSEND (več pomnilnika, več časa!). Ali pa z uporabo posebne funkcije, ki podpira dvosmerno izmenjavo podatkov: MPI_SENDRECV
• Uporaba ne-blokirajočih funkcijMPI_ISEND, MPI_IRECV
in testiranjem konca prenosa z MPI_WAITALL,
Process 0
Send(1)Recv(1)
Process 1
Recv(0)Send(0)
Process 0
Isend(1)Irecv(1)Waitall
Process 1
Isend(0)Irecv(0)Waitall
Process 0
Sendrecv(1)
Process 1
Sendrecv(0)
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:
• Pri MPI_SENDRECV prevzame 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_RECV MPI_SEND
MPI_SENDMPI_RECV
MPI_SENDMPI_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 sendbuf procesu dest in 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_SENDRECVMPI_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• status je 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 imamo MPI_ANY_TAG in/ali MPI_ANY_SOURCE pri 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_TAG namesto 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_RECV uporabimo konstanto MPI_ANY_SOURCE.
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 36
• 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);
MPI Timer
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
ts
tw
time
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
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 ); }
Meritev pasovne širine komunikacije- 2
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 40
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 */
Meritev pasovne širine komunikacije- 3
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.cmpd &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 datoteka in first.o - objektna datoteka*/
• 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 - objektna datoteka , 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 [email protected]:• 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.c z
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 51
Windows: Prevajanje z Visual C• Prevedi C:\Program Files\MPICH2\examples\cpi.c z
uporabo obstoječega Visual C projekta.
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 52
Windows: Izvajanje programa
• zaženi smpd.exe (servis za MPI – upravitelj procesov) z:
smpd -d (samo kot administrator)
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 53
Windows: Izvajanje programa• Izvedi z mpiexec.exe iz ukaznega okna z:
cd “C:\Program Files\MPICH2\bin\”mpiexec.exe -n 1 “..\examples\Debug\cpi.exe”(Če imate pri komunikaciji s strežnikom komplikacije, oporabite debug mode. (enako dela samo da izpisuje, kar se dogaja)