Buscar..


Observaciones

Las operaciones colectivas son llamadas MPI diseñadas para comunicar los procesos señalados por un comunicador en una sola operación o para realizar una sincronización entre ellos. Estos se utilizan a menudo para calcular uno o más valores basados ​​en datos aportados por otros procesos o para distribuir o recopilar datos de todos los demás procesos.

Tenga en cuenta que todos los procesos en el comunicador deben invocar las mismas operaciones colectivas en orden, de lo contrario la aplicación se bloquearía.

Emisión

El siguiente código difunde el contenido en el buffer entre todos los procesos que pertenecen al comunicador MPI_COMM_WORLD (es decir, todos los procesos que se ejecutan en paralelo) utilizando la operación 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);
}

Barrera

La operación MPI_Barrier realiza una sincronización entre los procesos que pertenecen al comunicador dado. Es decir, todos los procesos de un comunicador determinado esperarán dentro del MPI_Barrier hasta que todos estén dentro y, en ese momento, dejarán la operación.

int res;

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

Dispersión

El proceso raíz sendbuf el contenido en sendbuf a todos los procesos (incluso a sí mismo) utilizando la operación 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow