Professional Documents
Culture Documents
API
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;
}
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);
}
}