0
私は以下のようなプログラムを持っています。以下のコードでは、すべてのプロセスが他のすべてのプロセスの現在の反復ステップを認識しています。しかし、MPI_PUT、のような集合的な呼び出しなしでこれを行う方法があるのであれば、私は興味があります。特に、各プロセスが異なるレートで反復する場合はです。MPI(Asynchronous)Loop Iteration
#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;
}
MPI_Putは一括呼び出しではありません。 – powerrox
ああ、私はそれをMPI_Win_fenceと混同していると思います... – dnanto
RMAコールを使う前にMPI_Win_fenceを避けることはできません。その要件。外部のforループからフェンスを移動することによって、コードを最適化することができます。今のところ、NOPRECEDE&NOSUCCEEDは現在の場所では適切ではありません。 – powerrox