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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow