MPI (асинхронная) итерация цикла - PullRequest
0 голосов
/ 13 июля 2011

У меня есть программа, аналогичная приведенной ниже.В приведенном ниже коде все процессы знают текущий шаг итерации всех других процессов.Однако мне любопытно, есть ли способ сделать это без коллективного вызова, такого как MPI_PUT, , особенно в случае, когда каждый процесс повторяется с разной скоростью .

#include <errno.h>
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>


/* OUTPUT
 * $ mpirun -np 4 so00.exe
 * @[0]: p |       0       1       2       3
 * @[0]: p |       4       5       6       7
 * @[0]: p |       8       9       10      11
 * @[0]: p |       12      13      14      15
 * @[0]: p |       16      17      18      19
 * @[1]: p |       0       1       2       3
 * @[1]: p |       4       5       6       7
 * @[1]: p |       8       9       10      11
 * @[1]: p |       12      13      14      15
 * @[1]: p |       16      17      18      19
 * @[2]: p |       0       1       2       3
 * @[2]: p |       4       5       6       7
 * @[2]: p |       8       9       10      11
 * @[2]: p |       12      13      14      15
 * @[2]: p |       16      17      18      19
 * @[3]: p |       0       1       2       3
 * @[3]: p |       4       5       6       7
 * @[3]: p |       8       9       10      11
 * @[3]: p |       12      13      14      15
 * @[3]: p |       16      17      18      19
 */
int main(int argc, char *argv[])
{
    int i, n, rank, np;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &np);

    ////////////////////////////////////////////////////////////////////////////

    int *pos;
    MPI_Win win;
    MPI_Alloc_mem(sizeof(int)*np, MPI_INFO_NULL, &pos);
    MPI_Win_create(pos, np, sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win);

    for (i=rank; i<(np*5); i+=np)
    {
        MPI_Win_fence(MPI_MODE_NOPRECEDE, win);
        for (n = 0; n < np; n++)
        {
            MPI_Put(&i, 1, MPI_INT, n, rank, 1, MPI_INT, win);
        }
        MPI_Win_fence((MPI_MODE_NOSTORE | MPI_MODE_NOSUCCEED), win);
        printf("@[%d]: p | ", rank);
        for (n = 0; n < np; n++) printf("\t%d", pos[n]);
        printf("\n");
    }

    ////////////////////////////////////////////////////////////////////////////

    MPI_Win_free(&win);
    MPI_Free_mem(pos);

    MPI_Finalize();

    return EXIT_SUCCESS;
}

1 Ответ

0 голосов
/ 21 августа 2013

Не обязательно использовать MPI_Win_fence для синхронизации вызовов RMA в MPI.Также возможно использовать MPI_Lock (и его варианты), чтобы сделать так называемый режим «пассивной цели».Этот режим намного менее синхронизирован, так как не требует всех коллективных вызовов, которые делает режим «активной цели».

Слишком сложно, чтобы дать полный ответ здесь, но вы можете найти много статей опредмет вместе с документацией в Интернете.Полный стандарт MPI-3 доступен здесь .Посмотрите на Главу 11 для одностороннего общения.

...