在 MPI_Accumulate 之后得到不同的答案
Getting different answers after MPI_Accumulate
在下面的代码中,每次执行后我得到不同的答案,例如 1、2、3 mpirun -n 3 ./a.out
,而正确的答案是 3。为什么会这样?
#include <mpi.h>
#include <iostream>
int main()
{
MPI_Init(NULL, NULL);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int* a;
MPI_Win win;
MPI_Win_allocate(size*sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &a, &win);
int one = 1;
int target_proc = 0;
int shift = target_proc;
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, target_proc, 0, win);
MPI_Accumulate(&one, 1, MPI_INT, target_proc, shift, 1, MPI_INT, MPI_SUM, win);
MPI_Win_unlock(target_proc, win);
if (rank == target_proc)
std::cout << a[shift] << std::endl;
MPI_Win_free(&win);
MPI_Finalize();
return 0;
}
根本原因是您的程序中存在竞争条件:
没有什么能保证排名 0 会首先、第二或最后退出 MPI_Win_unlock()
,因此会出现不同的结果。
一个简单的解决方法是添加
MPI_Barrier(MPI_COMM_WORLD);
打印前a[0]
在下面的代码中,每次执行后我得到不同的答案,例如 1、2、3 mpirun -n 3 ./a.out
,而正确的答案是 3。为什么会这样?
#include <mpi.h>
#include <iostream>
int main()
{
MPI_Init(NULL, NULL);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int* a;
MPI_Win win;
MPI_Win_allocate(size*sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &a, &win);
int one = 1;
int target_proc = 0;
int shift = target_proc;
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, target_proc, 0, win);
MPI_Accumulate(&one, 1, MPI_INT, target_proc, shift, 1, MPI_INT, MPI_SUM, win);
MPI_Win_unlock(target_proc, win);
if (rank == target_proc)
std::cout << a[shift] << std::endl;
MPI_Win_free(&win);
MPI_Finalize();
return 0;
}
根本原因是您的程序中存在竞争条件:
没有什么能保证排名 0 会首先、第二或最后退出 MPI_Win_unlock()
,因此会出现不同的结果。
一个简单的解决方法是添加
MPI_Barrier(MPI_COMM_WORLD);
打印前a[0]