mpi
Kolektywne
Szukaj…
Uwagi
Operacje zbiorowe to wywołania MPI, które komunikują procesy wskazane przez komunikator w pojedynczej operacji lub wykonują synchronizację między nimi. Są one często używane do obliczania jednej lub więcej wartości na podstawie danych wniesionych przez inne procesy lub do dystrybucji lub gromadzenia danych ze wszystkich innych procesów.
Należy pamiętać, że wszystkie procesy w komunikatorze powinny wywoływać te same operacje zbiorcze w kolejności, w przeciwnym razie aplikacja zostałaby zablokowana.
Nadawanie
Poniższy kod rozgłasza zawartość w buffer
między wszystkimi procesami należącymi do komunikatora MPI_COMM_WORLD
(tj. Wszystkimi procesami działającymi równolegle) za pomocą operacji 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);
}
Bariera
Operacja MPI_Barrier
wykonuje synchronizację między procesami należącymi do danego komunikatora. Oznacza to, że wszystkie procesy z danego komunikatora będą czekać w MPI_Barrier
aż wszystkie będą w środku, i w tym momencie zakończą operację.
int res;
res = MPI_Barrier (MPI_COMM_WORLD); /* all processes will wait */
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Barrier failed\n");
exit (0);
}
Rozpraszać
Proces root rozprasza zawartość sendbuf
do wszystkich procesów (w tym siebie) za pomocą operacji 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
*/