Suche…


Bemerkungen

Kollektivoperationen sind MPI-Aufrufe, die entworfen sind, um die Prozesse zu kommunizieren, auf die ein Kommunikator in einer einzigen Operation hinweist, oder um eine Synchronisation zwischen ihnen durchzuführen. Diese werden häufig verwendet, um einen oder mehrere Werte basierend auf Daten zu berechnen, die von anderen Prozessen beigesteuert werden, oder um Daten aus allen anderen Prozessen zu verteilen oder zu sammeln.

Beachten Sie, dass alle Prozesse im Communicator der Reihe nach die gleichen kollektiven Operationen aufrufen sollten, andernfalls würde die Anwendung blockieren.

Übertragung

Mit dem folgenden Code werden die Inhalte im buffer zwischen allen zum MPI_COMM_WORLD Kommunikator gehörenden Prozessen (dh allen parallel laufenden Prozessen) mit der MPI_Bcast Operation übertragen.

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);
}

Barriere

Die MPI_Barrier Operation führt eine Synchronisation zwischen den Prozessen aus, die zu dem gegebenen Kommunikator gehören. Das heißt, alle Prozesse von einem bestimmten Kommunikator warten innerhalb des MPI_Barrier bis alle von ihnen innerhalb sind, und an diesem Punkt verlassen sie die Operation.

int res;

res = MPI_Barrier (MPI_COMM_WORLD); /* all processes will wait */
if (res != MPI_SUCCESS)
{
    fprintf (stderr, "MPI_Barrier failed\n");
    exit (0);
}

Streuen

Der sendbuf streut den Inhalt in sendbuf mit der MPI_Scatter Operation für alle Prozesse (einschließlich sich selbst).

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow