53
Univerza v Ljubljani, FE "Vzporedni sistemi - VS" ZS-2012/13 1 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/

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

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

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

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/

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

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

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

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.

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

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

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

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

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

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

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

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

Hello World

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

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.

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

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)

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

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”

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

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.

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

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.

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

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

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

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.

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

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.

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

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.

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

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.

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

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, …

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

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.

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

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)

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

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

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

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.

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

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

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

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.

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

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)

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

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

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

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.

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

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)

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

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

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

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

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

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.

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

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. */

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

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.

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

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.

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

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

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 */

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

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.

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

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

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

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*/

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

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”

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

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

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

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

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

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.

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

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)

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

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)