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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow