2017-12-15 12 views
1

のは、3つのプロセスがあるとしましょう、このコードは正常に動作します:予想通り3回「完了」MPI_Comm_splitとMPI_Send関数/ MPI_RECVとの関係

#include <iostream> 
#include <mpi.h> 
using namespace std; 

int main(){ 

    MPI_Init(NULL, NULL); 

    int rank; MPI_Comm SubWorld; int buf; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if (rank == 0){ 
     MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld); 
     MPI_Send(&buf, 1, MPI_INT, 1, 55, MPI_COMM_WORLD); 
    } 
    else if (rank == 1){ 
     MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld); 
     MPI_Recv(&buf, 1, MPI_INT, 0, 55, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    } 
    else MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld); 

    cout << "Done" << endl; 

    MPI_Finalize(); 

    return 0; 
} 

出力します。

しかし、このコードは、問題(また、3プロセス)を持っている:

#include <iostream> 
#include <mpi.h> 
using namespace std; 

int main(){ 

    MPI_Init(NULL, NULL); 

    int rank; MPI_Comm SubWorld; int buf; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if (rank == 0){ 
     MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld); 
     MPI_Send(&buf, 1, MPI_INT, 1, 55, MPI_COMM_WORLD); 
    } 
    else if (rank == 1){ 
     MPI_Recv(&buf, 1, MPI_INT, 0, 55, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld); 
    } 
    else MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld); 

    cout << "Done" << endl; 

    MPI_Finalize(); 

    return 0; 
} 

出力がありません!

この問題の原因となるMPI_Comm_splitとMPI_Send/MPI_Recvの関係はどういうものですか?

答えて

0

MPI_Comm_split()は、最初のコミュニケータのすべてのMPIタスク(ここではMPI_COMM_WORLD)が同時に呼び出す必要があることを意味します。あなたの例では

、ランク1MPI_Recv()でハングアップ、ひいてはMPI_Comm_split()ランク0には完了することはできません(とMPI_Send()が呼び出されることはありません)ので、デッドロック。

MPIプログラムの状態を視覚化するためにpadbと考えると、スタックがスタックしている場所を簡単に確認できます。

+0

もう一度、私が探していた答えをあなたにくれました。本当にありがとう。 – Abdulkader