2017-11-09 7 views
0

以下のコードでは、実行ごとに1,2,3などの異なる回答が得られます。mpirun -n 3 ./a.out 3が正しいですが、それはなぜですか?MPI_Accumulateの後に異なる答えを得る

#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

根本的な原因は、プログラム内の競合状態があります: 何もランク0がMPI_Win_unlock()、第1、第2、または最後の、ひいては異なる結果を終了することを保証しません。

簡単な修正は

MPI_Barrier(MPI_COMM_WORLD); 

a[0]

を印刷する前に追加することです
関連する問題