mpi
collectieven
Zoeken…
Opmerkingen
Collectieve bewerkingen zijn MPI-oproepen die zijn ontworpen om de processen te communiceren die door een communicator in één enkele bewerking worden aangegeven of om een synchronisatie tussen hen uit te voeren. Deze worden vaak gebruikt om een of meer waarden te berekenen op basis van gegevens die zijn bijgedragen door andere processen of om gegevens van alle andere processen te distribueren of te verzamelen.
Merk op dat alle processen in de communicator in volgorde dezelfde collectieve bewerkingen moeten oproepen, anders blokkeert de toepassing.
Uitzending
De volgende code verzendt de inhoud in buffer
tussen alle processen die behoren tot de MPI_COMM_WORLD
communicator (dwz alle processen die parallel lopen) met behulp van de MPI_Bcast
bewerking.
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ère
De bewerking MPI_Barrier
voert een synchronisatie uit tussen de processen die bij de gegeven communicator horen. Dat wil zeggen, alle processen van een bepaalde communicator wachten binnen de MPI_Barrier
totdat ze allemaal binnen zijn en op dat moment zullen ze de operatie verlaten.
int res;
res = MPI_Barrier (MPI_COMM_WORLD); /* all processes will wait */
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Barrier failed\n");
exit (0);
}
Verstrooien
Het sendbuf
verstrooit de inhoud in sendbuf
naar alle processen (inclusief zichzelf) met behulp van de MPI_Scatter
bewerking.
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
*/