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
 */


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow