You are on page 1of 3

MPI

Instalare Utilizare Elemente cheie Documentatie


- Tutorial: http://mpitutorial.com/tutorials/
* Compilare program C cu suport de MPI: mpicc my_program.c -o my_program * multi-proces - http://www.ats.ucla.edu/rct/hpc/parallel_computing/mpi-intro.htm
* Executare program compilat cu MPI: mpirun -np N ./my_program , * programare distribuita - http://www.netlib.org/utk/papers/mpi-book/mpi-book.html
apt-get install mpich2
unde N=numar de procese * se poate folosi in conjunctura cu - http://www.llnl.gov/computing/tutorials/mpi/
* In codul sursa se foloseste: #include <mpi.h> OpenMP

API

1. Tipuri de date (lista completa: http://thy.phy.bnl.gov/~creutz/qcdoc/mpi/mpi.h)


C Echivalent MPI
char MPI_CHAR
int MPI_INT
float MPI_FLOAT
double MPI_DOUBLE

2. Initializare si oprire
Apel Efect Exemplu
MPI_Init( #include <mpi.h>
&argc, int main (int argc, char* argv[])
Initializeaza environment-ul MPI cu parametrii corespunzatori.
&argv {
) MPI_Init (&argc, &argv);
//...
MPI_Finalize();
MPI_Finalize() Opreste environment-ul MPI si distruge toate structurile de date interne create. return 0;
}

3. Colectare informatii despre environment


Apel Efect Exemplu Output pentru 2 procese (mpirun -np 2)
MPI_Comm_rank ( Intoarce rank-ul (rangul) procesului MPI care se executa, si se retine in variabila rank. Valoare #include <mpi.h> Hello from process 0 of 2
comm, intre 0 si N-1. comm este un handle ce marcheaza vizibilitatea unui mesaj la nivelul int main (int argc, char* argv[]) Hello from process 1 of 2
&rank environment-ului MPI. Pentru a referi intregul environment MPI se foloseste valoarea {
) MPI_COMM_WORLD int rank, size;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size ( MPI_Comm_size (MPI_COMM_WORLD, &size);
Intoarce numarul de procese MPI care se executa simultan, si se retine in variabila size. Valoare printf( "Hello from process %d of %d\n", rank, size
comm,
egala cu N. comm este un handle ce marcheaza vizibilitatea unui mesaj la nivelul environment- );
&size
ului MPI. Pentru a referi intregul environment MPI se foloseste valoarea MPI_COMM_WORLD MPI_Finalize();
)
return 0;
}

4. Sincronizare
Apel Efect Exemplu
MPI_Barrier( Blocheaza executia proceselor pana cand toate au ajuns la acest punct. comm = handle ce marcheaza vizibilitatea unui mesaj la nivelul environment-ului MPI. Pentru toate procesele
Comm din cadrul unui environment MPI se foloseste valoarea MPI_COMM_WORLD MPI_Barrier(MPI_COMM_WORLD);
)
Dr. Ing. Alecsandru Ptracu, 2015 1/3
5. Transfer de informatii intre procese
Apel Efect Exemplu
Trimite un mesaj de la procesul curent la procesul destinatie. #include <mpi.h>
MPI_Send ( data = datele care urmeaza a fi trimise #include <stdio.h>
data, #include <stdlib.h>
data_length = lungimea datelor (numarul de bytes) care urmeaza a fi trimise
data_length,
mpi_datatype = unul din tipurile de date mentionate la punctul 1 int main(int argc, char** argv)
mpi_datatype,
destination_rank, destination_rank = rank-ul procesului catre care se trimite mesajul {
// Initialize the MPI environment
tag, tag = numar care semnifica tag-ul mesajului care urmeaza a fi trimis
MPI_Init(NULL, NULL);
comm comm = handle ce marcheaza vizibilitatea unui mesaj la nivelul environment-ului MPI. Pentru a trimite
) mesaj catre toate procesele din cadrul unui environment MPI se foloseste valoarea // Find out rank, size
MPI_COMM_WORLD int world_rank;
Primeste un mesaj de la procesul sursa. MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
data = mesajul care urmeaza a fi primite MPI_Comm_size(MPI_COMM_WORLD, &world_size);
data_length = lungimea datelor primite
mpi_datatype = unul din tipurile de date mentionate la punctul 1 // We are assuming at least 2 processes for this task
if (world_size < 2) {
MPI_Recv ( source_rank = rank-ul procesului de la care se primeste mesajul. Se poate folosi valoarea fprintf(stderr, "World size must be greater than 1 for %s\n", argv[0]);
data, MPI_ANY_SOURCE pentru a primi mesaje de la orice proces MPI_Abort(MPI_COMM_WORLD, 1);
data_length, tag = numar care semnifica tag-ul mesajului care urmeaza a fi primit. Se poate folosi valoarea }
mpi_datatype, MPI_ANY_TAG pentru a primi toate mesajele, indiferent de tag.
int number;
source_rank, comm = handle ce marcheaza vizibilitatea unui mesaj la nivelul environment-ului MPI. Pentru a trimite if (world_rank == 0) {
tag, mesaj catre toate procesele din cadrul unui environment MPI se foloseste valoarea // If we are rank 0, set the number to -1 and send it to process 1
comm, MPI_COMM_WORLD number = -1;
&status status = un obiect de tipul MPI_Status, folosit in context dinamic (de ex atunci cand nu se stie rank- MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
) ul procesului de la care se primeste mesajul). Acesta contine informatii suplimentare precum: } else if (world_rank == 1) {
MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
rank-ul sursei (campul MPI_SOURCE) printf("Process 1 received number %d from process 0\n", number);
tag-ul mesajului (campul MPI_TAG) }
Pentru context static, in care se stie exact de la care proces se primeste mesajul, se poate folosi MPI_Finalize();
valoarea MPI_STATUS_IGNORE }
#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char **argv)
{
char message[20];
int rank, size, root=0;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
Trimite un mesaj catre toate celelalte procese if (rank == root)
MPI_Bcast( strcpy(message, "Hello, world");
data = datele care urmeaza a fi trimise
data, MPI_Bcast(message, 13, MPI_CHAR, root, MPI_COMM_WORLD);
data_length = lungimea datelor (numarul de bytes) care urmeaza a fi trimise printf( "Message from process %d : %s\n", rank, message);
data_length,
mpi_datatype = unul din tipurile de date mentionate la punctul 1 MPI_Finalize();
mpi_datatype, }
broadcaster_rank, broadcaster_rank = rank-ul procesului care a trimis mesajul de tip broadcast
Echivalent cu MPI_Send si MPI_Recv:
comm comm = handle ce marcheaza vizibilitatea unui mesaj la nivelul environment-ului MPI. Pentru a trimite void my_bcast(void* data, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
) mesaj catre toate procesele din cadrul unui environment MPI se foloseste valoarea {
MPI_COMM_WORLD int world_rank; MPI_Comm_rank(comm, &world_rank);
int world_size; MPI_Comm_size(comm, &world_size);
if (world_rank == root) {
for (int i = 0; i < world_size; i++) {
if (i != world_rank) {
MPI_Send(data, count, datatype, i, 0, comm);
}
}
} else {
MPI_Recv(data, count, datatype, root, 0, comm, MPI_STATUS_IGNORE);
}
}

Dr. Ing. Alecsandru Ptracu, 2015 2/3


6. Scatter/Gather & Reduce
Apel Efect Exemplu
Imparte un buffer de date catre toate procesele MPI
MPI_Scatter ( send_data = datele care urmeaza a fi trimise; se gasesc in procesul master. Inclusiv procesul master va primi un chunk de date!
send_data, send_count = dimensiunea datelor trimite catre procese
send_count, send_datatype = unul din tipurile de date mentionate la punctul 1
send_datatype, recv_data = datele care urmeaza a fi primite de la procesul master
recv_data,
recv_count = dimensiunea datelor primite
recv_count,
recv_datatype, recv_datatype = unul din tipurile de date mentionate la punctul 1
root, root = rank-ul procesului master
comm comm = handle ce marcheaza vizibilitatea unui mesaj la nivelul environment-ului MPI. Pentru a trimite mesaj catre toate procesele
) din cadrul unui environment MPI se foloseste valoarea MPI_COMM_WORLD

Colecteaza datele de la toate procesele MPI in procesul master


send_data = datele care urmeaza a fi trimise https://github.com/wesleykendall/mpitutorial/blob/gh
send_count = dimensiunea datelor trimite catre master -pages/tutorials/mpi-scatter-gather-and-
allgather/code/avg.c
send_datatype = unul din tipurile de date mentionate la punctul 1
MPI_Gather(
send_data, recv_data = datele care urmeaza a fi primite de la procesele non-master; pentru toate, in afara de cel master, parametrul acesta
send_count, poate sa fie NULL
send_datatype, recv_count = dimensiunea datelor primite
recv_data, recv_datatype = unul din tipurile de date mentionate la punctul 1
recv_count,
recv_datatype, root = rank-ul procesului master
root, comm = handle ce marcheaza vizibilitatea unui mesaj la nivelul environment-ului MPI. Pentru a trimite mesaj catre toate procesele
comm din cadrul unui environment MPI se foloseste valoarea MPI_COMM_WORLD
)

Aplica o operatie, distribuit, folosind toate procesele MPI


MPI_Reduce( send_data = datele care urmeaza a fi trimise
send_data, recv_data = datele care urmeaza a fi primite. Au o dimensiune egala cu sizeof(datatype) * count
recv_data,
count, count = dimensiunea datelor primite https://github.com/wesleykendall/mpitutorial/blob/gh
datatype, datatype = unul din tipurile de date mentionate la punctul 1 -pages/tutorials/mpi-reduce-and-
op, op = variabila de tipul MPI_Op, ce poate lua, printre altele valori precum: MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD allreduce/code/reduce_avg.c
root, root = rank-ul procesului master
comm
) comm = handle ce marcheaza vizibilitatea unui mesaj la nivelul environment-ului MPI. Pentru a trimite mesaj catre toate procesele
din cadrul unui environment MPI se foloseste valoarea MPI_COMM_WORLD

Dr. Ing. Alecsandru Ptracu, 2015 3/3

You might also like