Recherche…


Remarques

Les opérations de collectifs sont des appels MPI conçus pour communiquer les processus signalés par un communicateur en une seule opération ou pour effectuer une synchronisation entre eux. Celles-ci sont souvent utilisées pour calculer une ou plusieurs valeurs en fonction des données fournies par d'autres processus ou pour distribuer ou collecter des données de tous les autres processus.

Notez que tous les processus du communicateur doivent invoquer les mêmes opérations collectives dans l'ordre, sinon l'application serait bloquée.

Diffuser

Le code suivant diffuse le contenu dans le buffer parmi tous les processus appartenant au communicateur MPI_COMM_WORLD (c'est-à-dire tous les processus exécutés en parallèle) à l'aide de l'opération MPI_Bcast .

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

L'opération MPI_Barrier effectue une synchronisation entre les processus appartenant au communicateur donné. C'est-à-dire que tous les processus d'un communicateur donné attendent dans le MPI_Barrier jusqu'à ce qu'ils soient tous à l'intérieur, et ils quitteront alors l'opération.

int res;

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

Dispersion

Le processus racine disperse le contenu de sendbuf dans tous les processus (y compris lui-même) à l'aide de l'opération MPI_Scatter .

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow