mpi
kollektiv
Sök…
Anmärkningar
Kollektivoperationer är MPI-samtal som är utformade för att kommunicera de processer som en kommunikatör påpekade i en enda operation eller för att utföra en synkronisering bland dem. Dessa används ofta för att beräkna ett eller flera värden baserat på data som bidragit med andra processer eller för att distribuera eller samla data från alla andra processer.
Observera att alla processer i kommunikatorn bör åberopa samma kollektiva operationer i ordning, annars skulle applikationen blockera.
Utsända
Följande kod sänder innehållet i buffer
bland alla processer som tillhör MPI_COMM_WORLD
kommunikatorn (dvs. alla processer som körs parallellt) med MPI_Bcast
operationen.
int rank;
int res;
res = MPI_Comm_rank (MPI_COMM_WORLD, &rank);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Comm_rank failed\n");
exit (0);
}
int buffer[100];
if (rank == 0)
{
// Process with rank id 0 should fill the buffer structure
// with the data it wants to share.
}
res = MPI_Bcast (buffer, 100, MPI_INT, 0, MPI_COMM_WORLD);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Bcast failed\n");
exit (0);
}
Barriär
MPI_Barrier
operationen utför en synkronisering mellan processerna som tillhör den givna kommunikatorn. Det vill säga att alla processer från en given kommunikatör väntar inom MPI_Barrier
tills alla är inuti, och vid den tidpunkten kommer de att lämna operationen.
int res;
res = MPI_Barrier (MPI_COMM_WORLD); /* all processes will wait */
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Barrier failed\n");
exit (0);
}
Sprida ut
Rotprocessen sprider innehållet i sendbuf
till alla processer (inklusive sig själv) med MPI_Scatter
operationen.
int rank;
int size;
int sendcount = 1;
int recvcount = sendcount;
int sendbuf[3];
int recvbuf;
int root = 0;
MPI_Comm_size (MPI_COMM_WORLD, &size);
if (size != 3)
{
fprintf (stderr, "Number of processes must be 3\n");
exit (0);
}
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
if (rank == 0)
{
sendbuf[0] = 3;
sendbuf[1] = 5;
sendbuf[2] = 7;
}
MPI_Scatter (sendbuf, sendcount, MPI_INT, &recvbuf, recvcount, MPI_INT, root, MPI_COMM_WORLD);
printf ("rank: %i, value: %i\n", rank, recvbuf);
/* Output:
* rank: 0, value: 3
* rank: 1, value: 5
* rank: 2, value: 7
*/