Download as pdf or txt
Download as pdf or txt
You are on page 1of 25

HP-SEE

Uvod u MPI programiranje


www.hp-see.eu
Mihajlo Savic
Elektrotehnicki fakultet Banja Luka

The HP-SEE initiative is co-funded by the European Commission under the FP7 Research Infrastructures contract no. 261499

Izvori informacija
Prezentacija zasnovana na

University of Notre Dame

MPI Tutorial

Laboratory for Scientific Computing

http://www.lam-mpi.org/tutorials/nd

M.D. McNally

Jeremy Siek

HP-SEE Student Training Banja Luka December

Paralelno procesiranje
Vrste paralelnih maina

Vieprocesorske maine

Klasteri

Dijeljena memorija

Komunikacija porukama

MPI Message Passing Interface

MPICH, LAM/MPI, MPILite, ...

HP-SEE Student Training Banja Luka December

ta je MPI?
Specifikacija biblioteke za prosljeivanje poruka

Podrka za brojne programske jezike

C, C++, Java, Fortran, ...

Podrka za

Vieprocesorske maine

Klastere

Mreno povezane raunare

HP-SEE Student Training Banja Luka December

Osobine MPI
Podrka za siguran rad sa porukama

Podrka za niti

Podrka za point-to-point komunikaciju

Blokirajua, neblokirajua, baferi, ...

Podrka za kolektivnu komunikaciju

Dijeljenje i prikupljanje podataka, obrada u


toku prikupljanja, ...

Veliki broj algoritama rada

HP-SEE Student Training Banja Luka December

Kompleksnost MPI
MPI ima vie od stotinu funkcija/metoda

MPI-1 128

MPI-2 152

Za rjeavanje konkretnog problema nam


rijetko trebaju sve

Mnoge probleme mogue rijeiti sa mnogo


manjim brojem (min. 6)

HP-SEE Student Training Banja Luka December

Prvi MPI program


#include "mpi.h"
#include <stdio.h>
int main (int argc, char **argv) {
MPI_Init (&argc, &argv);
printf ("Moj prvi MPI program!\n");
MPI_Finalize ();
}
HP-SEE Student Training Banja Luka December

Kako dalje?
$ mpicc prvi.c -o prvi
$ mpirun -n 1 prvi
Moj prvi MPI program!
$ mpirun -n 2 prvi
Moj prvi MPI program!
Moj prvi MPI program!
$ mpirun -n 4 prvi
Moj prvi MPI program!
Moj prvi MPI program!
Moj prvi MPI program!
Moj prvi MPI program!

HP-SEE Student Training Banja Luka December

Drugi MPI program


#include "mpi.h"
#include <stdio.h>
int main (int argc, char **argv) {
int ukupno, cvor;
MPI_Init (&argc, &argv);
MPI_Comm_size (MPI_COMM_WORLD, &ukupno);
MPI_Comm_rank (MPI_COMM_WORLD, &cvor);
printf ("Ukupno pokrenutih procesa: %d. Moj broj: %d\n", ukupno, cvor);
MPI_Finalize ();
}
HP-SEE Student Training Banja Luka December

Drugi MPI program


$ mpicc drugi.c -o drugi
$ mpirun -n 4 drugi
Ukupno pokrenutih procesa: 4. Moj broj: 0
Ukupno pokrenutih procesa: 4. Moj broj: 3
Ukupno pokrenutih procesa: 4. Moj broj: 1
Ukupno pokrenutih procesa: 4. Moj broj: 2

HP-SEE Student Training Banja Luka December

10

MPI primjer
#include "mpi.h"
#include <stdio.h>
int main (int argc, char **argv) {
int ukupno, cvor, rezultat;
rezultat = MPI_Init (&argc, &argv);
if (rezultat != MPI_SUCCESS) {
printf ("Doslo je do greske pri pokretanju MPI programa.\n");
MPI_Abort (MPI_COMM_WORLD, rezultat);
}
MPI_Comm_size (MPI_COMM_WORLD, &ukupno);
MPI_Comm_rank (MPI_COMM_WORLD, &cvor);
// Ovdje ide korisni dio koda
printf ("Ukupno pokrenutih procesa: %d. Moj broj: %d\n", ukupno, cvor);
MPI_Finalize ();
}
HP-SEE Student Training Banja Luka December

11

MPI komunikacija
Point-to-point komunikacija

alju se podaci od poetne adrese,


navedene vrste i broja

Vrsta ugraena ili korisniki izvedena iz


ugraenih (CHAR, INT, ...)

Fleksibilan nain komunikacije

Isporuka poruka po zadanom redoslijedu


ograniena garancija

HP-SEE Student Training Banja Luka December

12

MPI komunikacija
Blokirajua komunikacija

MPI_Send(start, broj, vrsta, odredite, tag,


domen)

MPI_Recv(start, broj, vrsta,


izvorite, tag, domen, status)

MPI_ANY_SOURCE i MPI_ANY_TAG kod


prijema poruka

Domen je za nas MPI_COMM_WORLD

HP-SEE Student Training Banja Luka December

13

#include "mpi.h"
#include <stdio.h>
#include <string.h>

MPI

int main (argc, argv)


int argc;
char *argv[]; {
int ukupno, broj, rezultat;
char odlazna[255], dolazna[255];
int posiljalac, primalac, tag, velicina;
MPI_Status mpi_status;
rezultat = MPI_Init(&argc, &argv);
if (rezultat != MPI_SUCCESS)
{
printf ("Doslo je do greske pri pokretanju MPI programa.\n");
MPI_Abort(MPI_COMM_WORLD, rezultat);
}
MPI_Comm_size(MPI_COMM_WORLD, &ukupno);
MPI_Comm_rank(MPI_COMM_WORLD, &broj);
printf ("Ukupno procesa: %d Moj broj: %d\n", ukupno, broj);

HP-SEE Student Training Banja Luka December

14

MPI

if (broj == 0) { // da li sam cvor 0?


strcpy(odlazna,"Cao proces!");
rezultat=MPI_Send(odlazna,strlen(odlazna)+1,MPI_CHAR,1,9,MPI_COMM_WORLD);
// saljemo 1 poruku koja sadrzi CHAR cvoru 1 sa tagom 9
rezultat=MPI_Recv(dolazna,255,MPI_CHAR,1,4,MPI_COMM_WORLD,&mpi_status);
// ocekujemo 1 poruku CHARova od cvora 1 sa tagom 4
}
if (broj == 1) { // da li sam cvor 1?
strcpy(odlazna,"Cao i tebi, procesu!");
rezultat=MPI_Recv(dolazna,255,MPI_CHAR,0,9,MPI_COMM_WORLD,&mpi_status);
// ocekujemo 1 poruku CHARova od cvora 0 sa tagom 9
rezultat=MPI_Send(odlazna,strlen(odlazna)+1,MPI_CHAR,0,4,MPI_COMM_WORLD);
// saljemo 1 poruku koja sadrzi CHAR cvoru 0 sa tagom 4
}
if (broj < 2) { // prva dva procesa
printf("Proces %d primio poruku od procesa %d sljedeceg sadrzaja:
%s\n",broj, mpi_status.MPI_SOURCE, dolazna);
rezultat=MPI_Get_count(&mpi_status, MPI_CHAR, &velicina);
printf("Proces %d je primio %d poruka od procesa %d sa tagom %d \n\n",
broj, velicina, mpi_status.MPI_SOURCE, mpi_status.MPI_TAG);
}
// Kraj korisnog dijela koda
MPI_Finalize();
}

HP-SEE Student Training Banja Luka December

15

MPI komunikacija
$ mpicc poruke.c -o poruke
$ mpirun -n 4 poruke
Ukupno pokrenutih procesa: 4 Moj broj: 0
Ukupno pokrenutih procesa: 4 Moj broj: 2
Ukupno pokrenutih procesa: 4 Moj broj: 1
Ukupno pokrenutih procesa: 4 Moj broj: 3
Proces 1 primio poruku od procesa 0 sljedeceg sadrzaja:
Ovo je odlazna poruka sa cvora 0.
Proces 1 je primio 34 poruka od procesa 0 sa tagom 9
Proces 0 primio poruku od procesa 1 sljedeceg sadrzaja:
Ovo je poruka sa cvora 1.
Proces 0 je primio 26 poruka od procesa 1 sa tagom 4
HP-SEE Student Training Banja Luka December

16

MPI programiranje
Veliki broj programa se moe realizovati
pomou samo:

MPI_Init

MPI_Comm_size

MPI_Comm_rank

MPI_Send

MPI_Recv

MPI_Finalize

HP-SEE Student Training Banja Luka December

17

MPI kolektivna komunikacija


MPI_Bcast(start, broj, vrsta, root, domen)
alje podatke (iste) sa jednog vora svim ostalim
vorovima
MPI_Reduce(start, broj, vrsta, operacija, root, domen)
Prikuplja podatke sa svih vorova i daje ih jednom
procesu na obradu
Operacija: min/max/suma/proizvod/AND/...
Ili korisniki definisana po elji
HP-SEE Student Training Banja Luka December

18

MPI kolektivna komunikacija


MPI_Scatter(start1, broj1, vrsta1,
start2, broj2, vrsta2, root, domen)
alje izdijeljene podatke sa jednog vora svim po dio
MPI_Gather(start1, broj1, vrsta1,
start2, broj2, vrsta2, root, domen)
Prikuplja parcijalne podatke sa svih vorova i kombinuje ih
u jednom procesu
MPI_Barrier(domen)
Sinhronizacija - svi ekaju dok ne stignu na isto mjesto
HP-SEE Student Training Banja Luka December

19

MPI kolektivna komunikacija


// Pocetak korisnog dijela koda
rezultat = MPI_Barrier(MPI_COMM_WORLD);
if (broj == 0) {
broj_unosa=32;
// Saljemo poruku sa roota
MPI_Bcast(&broj_unosa,1,MPI_INT,0,MPI_COMM_WORLD);
} else {
// Primamo poruku na drugim cvorovima
rezultat = MPI_Bcast(&broj_unosa,1,MPI_INT,0,MPI_COMM_WORLD);
printf("Cvor %d primljena poruka: %d\n",broj,broj_unosa);
}

HP-SEE Student Training Banja Luka December

20

MPI kolektivna komunikacija


$ mpicc kol1.c -o kol1
$ mpirun -n 4 kol1
Ukupno pokrenutih procesa: 4 Moj broj: 0
Ukupno pokrenutih procesa: 4 Moj broj: 3
Ukupno pokrenutih procesa: 4 Moj broj: 1
Ukupno pokrenutih procesa: 4 Moj broj: 2
Cvor 1 primljena poruka: 32
Cvor 2 primljena poruka: 32
Cvor 3 primljena poruka: 32
Cvor 3 primljena poruka: 32
HP-SEE Student Training Banja Luka December

21

MPI kolektivna komunikacija


Mogua je i komunikacija svi-svi

Naziv se mijenja tako da

MPI_Reduce postaje MPI_Allreduce

U tom sluaju svi vorovi primaju poruku

Promjenjiva veliina podataka

MPI_Gather postaje MPI_Gatherv

HP-SEE Student Training Banja Luka December

22

MPI kolektivna komunikacija


A

BROADCAST

A
A
A
A

A B C D

SCATTER

A
B
C
D

GATHER

A
B
C
D

ALLGATHER

HP-SEE Student Training Banja Luka December

A
A
A
A

B
B
B
B

C
C
C
C

D
D
D
D
23

Kopiranje stringova
char poruka[VELICINA] = ""; // predefinisana velicina

int safe_strcat(char *sufiks)


{
if (strlen(poruka)+strlen(sufiks)+sizeof(char)
>= VELICINA)
return(1); // 1 je kod za gresku u ovom slucaju
strcat(poruka,sufiks);
return(0); // 0 znaci da je sve OK
}
HP-SEE Student Training Banja Luka December

24

Kopiranje stringova
char *poruka; // ne znamo velicinu

int safe_strcat(char *sufiks)


{
poruka=realloc(poruka,strlen(poruka) +
strlen(sufiks)+sizeof(char));
if (!poruka) return(1); // 1 je kod za gresku
strcat(poruka,sufiks);
return(0); // 0 znaci da je sve OK
}
HP-SEE Student Training Banja Luka December

25

You might also like