Поиск…


замечания

Коллективные операции - это вызовы MPI, предназначенные для передачи процессов, указанных коммуникатором за одну операцию, или для выполнения синхронизации между ними. Они часто используются для вычисления одного или нескольких значений на основе данных, предоставленных другими процессами, или для распределения или сбора данных из всех других процессов.

Обратите внимание, что все процессы в коммуникаторе должны приводить к одинаковым коллективным операциям в порядке, иначе приложение будет блокироваться.

Broadcast

Следующий код транслирует содержимое в buffer среди всех процессов, принадлежащих коммуникатору MPI_COMM_WORLD (т.е. все процессы, выполняющиеся параллельно), используя операцию 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);
}

барьерный

Операция MPI_Barrier выполняет синхронизацию между процессами, принадлежащими данному коммуникатору. То есть все процессы от данного коммуникатора будут ждать внутри MPI_Barrier пока все они не будут внутри, и в этот момент они оставят операцию.

int res;

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

рассеивать

Корневой процесс sendbuf содержимое в sendbuf всем процессам (включая себя) с MPI_Scatter операции 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow