Vzporedni in porazdeljeni sistemi in algoritmi: Vaje MPI PREDAVATELJ: PATRICIO BULIĆ ASISTENT: DAVOR SLUGA
MPI Message Passing Interface Standard za medprocesno komunikacijo v paralelnih računalnikih in gručah Specifikacija za razvijalce in uporabnike, ne gre za točno določeno knjižnico Podpora za C, C++ in Fortran Različne implementacije OpenMPI, MPICH, Intel MPI, Microsoft MPI,
Razlogi za uporabo Razlogi za uporabo MPI Zrel in dobro razumljen produkt (prva specifikacija iz leta 1992) Dobro prilagojen na strojno in programsko opremo računalniških gruč Podprt s standardom Prenosljiv na nivoju kode Množica uporabnih funkcij v knjižnicah
Kaj nam ponuja Kaj nam ponuja? Komunikacija točka-točka Strukturirana sporočila, lahko z lastnimi podatkovnimi tipi Režimi Sinhronizacija Predpomnenje Skupinska komunikacija Vgrajene operacije in operacije, ki jih definira uporabnik Množica funkcij za prenos podatkov Definiranje podskupin Topologija je lahko prilagojena aplikaciji Spremljanje delovanja Možnost za opazovanje sistema z različnimi orodji
Osnove delovanja Uporabnik poskrbi, da ima vsak proces dostop do izvršilne datoteke, vhodnih datotek in izhodnih datotek; dve rešitvi: dostop do mrežnih virov (network share) oz. porazdeljen datotečni sistem kopiranje datotek na vozlišča in nazaj Procesi morajo imeti pravico, da se zaženejo preko mreže (izklopljen ali ustrezno nastavljen požarni zid) ; S klicem ukaza mpiexec (mpirun) vsak proces začne izvajati svoj program - običajno je program en sam; Za različne funkcionalnosti programa na različnih procesih poskrbimo z vejitvami na podlagi oznake procesa
MPI osnovni ukazi Inicilizacija MPI okolja, MPI_Init(&argc, &argv); Pred to funkcijo ne kličemo nobenih MPI funkcij Zapiranje povezav MPI_Finalize(); Za to funkcijo ne kličemo nobenih MPI funkcij Število procesov, ki se izvajajo MPI_Comm_size(MPI_COMM_WORLD,&num_of_processes); komunikator MPI_COMM_WORLD Skupina procesov, ki si izmenjuje sporočila Rank oz. identifikator procesa zaporedna števila [0, num_of_processes-1] MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI osnovni ukazi Pošiljanje sporočila MPI_Send(void *message, int count, MPI_Datatype, int destination, int tag, MPI_Comm communicator); Sprejemanje sporočila MPI_Recv(void *message, int count, MPI_Datatype, int source, int tag, MPI_Comm communicator, MPI_Status *status);
MPI in NSC Nameščena knjižnica OpenMPI Prevajanje in zaganjanje na NSC module load mpi mpicc <vhodna_datoteka.c> -o <izhodna_datoteka> salloc n<stevilo procesov> --reservation=fri mpirun np <stevilo_procesov>./<izhodna_datoteka> Na NSC imamo porazdeljen datotečni system (ceph) Vsa vozlišča vidijo datoteke v vašem domačem direktoriju
Skupinska komunikacija Sinhronizacija MPI_Barrier(MPI_comm comm) Prepreka, s katero zahtevamo, da se vsi procesi počakajo Izvajanje programa za MPI_Barrier se nadaljuje šele potem, ko MPI_Barrier dosežejo vsi procesi Klic funkcije MPI_Barrier morajo izvesti vsi procesi v komunikatorju
Skupinska komunikacija Oddajanje (broadcast) MPI_Bcast(void* buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm) Pošiljanje sporočila s procesa z identifikatorjem root vsem ostalim procesom v komunikatorju root označuje korenski proces Za korenski proces je polje buf vhodni parameter, pri vseh ostalih procesih pa izhodni parameter Vsi ostali procesi morajo tudi klicati MPI_Bcast, pri čemer je z argumentom root naveden korenski proces
Skupinska komunikacija Raztros MPI_Scatter(void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm);
Skupinska komunikacija Zbiranje MPI_Gather(void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm);