在MPI_Accumulate之后获得不同的答案

时间:2017-11-09 15:02:55

标签: c++ mpi openmpi

在下面的代码中,我会在每次执行mpirun -n 3 ./a.out后获得不同的答案,例如1,2,3,而正确的答案是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;
}

1 个答案:

答案 0 :(得分:0)

根本原因是您的计划中存在竞争条件: 没有什么可以保证等级0将首先,第二或最后退出MPI_Win_unlock(),因此结果不同。

一个简单的解决方法是添加

MPI_Barrier(MPI_COMM_WORLD);
打印前{p> a[0]