MPI-2 の機能を片面通信に使用して、分散ハッシュ テーブルのプログラムを作成しようとしています。各プロセスは、最初にメモリ (B) を他のすべてのプロセスに公開します。次に、うまくいけば、各プロセスが同期せずに他のプロセスのメモリにアクセスできるようになります。これまでのところ、私が持っているものを以下に示します ( http://mpi.deino.net/mpi_functions/MPI_Put.htmlの例から変更されたコード)。最後に、B[99] の値が間違っている場合があります (実行ごとに異なります)。私は何を間違っていますか?
編集: 最後に待機呼び出しを使用して上記の問題を修正しましたが、各 MPI_Get 呼び出しの完了を待ちたいと思います。しかし、唯一のオプションは、グローバル同期を必要とする MPI_Win_fence か、各 MPI_Get 呼び出しの MPI_Win_start/MPI_Win_complete のようです。以下に示すように後者を 1 回呼び出して、各 MPI_Get 呼び出しの後に何らかの形で待機することは可能ですか?
#include "mpi.h"
#include "stdio.h"
#define SIZE2 200
int main(int argc, char *argv[])
{
int rank, nprocs, *B;
MPI_Group comm_group;
MPI_Win winl;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Alloc_mem(SIZE2 * sizeof(int), MPI_INFO_NULL, &B);
for(int i=0; i<SIZE2; i++) B[i] = 0;
MPI_Comm_group(MPI_COMM_WORLD, &comm_group);
MPI_Win_create(B, SIZE2*sizeof(int), sizeof(int),MPI_INFO_NULL, MPI_COMM_WORLD, &winl);
MPI_Win_post(comm_group, 0, winl);
MPI_Win_start(comm_group, 0, winl);
if(rank == 0)
{
int drank = (rank == 0) ? 1 : 0;
int value = 200, value1;
int index = 99;
MPI_Get(&value1, 1, MPI_INT, drank, index+1, 1, MPI_INT, winl);
MPI_Put(&value, 1, MPI_INT, drank, index, 1, MPI_INT, winl);
MPI_Get(&value1, 1, MPI_INT, drank, index+1, 1, MPI_INT, winl);
MPI_Put(&value, 1, MPI_INT, drank, index, 1, MPI_INT, winl);
}
MPI_Win_complete(winl);
MPI_Win_wait(winl);
printf("%d: %d %d\n",rank,B[99],B[100]);
MPI_Group_free(&comm_group);
MPI_Win_free(&winl);
MPI_Free_mem(B);
MPI_Finalize();
return 0;
}