У меня есть программа, аналогичная приведенной ниже.В приведенном ниже коде все процессы знают текущий шаг итерации всех других процессов.Однако мне любопытно, есть ли способ сделать это без коллективного вызова, такого как 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;
}