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