if文

2017-12-14 20 views
0

私は1つのプロセスでこのコードを実行すると、それが正常に動作にMPI_Comm_splitを使用して:if文

#include <iostream> 
#include "mpi.h" 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    MPI_Comm SubWorld; 
    MPI_Init(&argc, &argv); 

    int Rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &Rank); 

    if (Rank == 0) 
     MPI_Comm_split(MPI_COMM_WORLD, 1, Rank, &SubWorld); 

    cout << Rank << endl; 

    MPI_Finalize(); 

    return 0; 
} 

出力:0

しかし、私は複数のプロセスでそれを実行すると、出力があります"1"のみ!

このコードは正常に動作します:

#include <iostream> 
#include "mpi.h" 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    MPI_Comm SubWorld; 
    MPI_Init(&argc, &argv); 

    int Rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &Rank); 

    MPI_Comm_split(MPI_COMM_WORLD, 1, Rank, &SubWorld); 

    cout << Rank << endl; 

    MPI_Finalize(); 

    return 0; 
} 

を出力し、いくつかのために "0" と "1" の2本のライン。

私は複数のプロセスで実行すると最初のコードで何が間違っているのでしょうか?

答えて

0

MPI_Comm_split()は一括操作であり、すべて(ここではMPI_COMM_WORLD)のMPIタスクによって呼び出されなければなりません。

それでは、実際に複数のノード上で実行して、あなたの最初の例で起こることは、あなたがMPI_COMM_WORLDの上にこのルーチンを呼び出した後、MPI_COMM_WORLDに各プロセスがsplited MPI_Commに属している必要がありますを意味し、MPI_Comm_split()

+0

グレートでMPIタスク0ハングということです。右? – Abdulkader

+0

はい。いくつかのタスクでは、新しいコミュニケータは 'MPI_COMM_NULL'かもしれません。そして、私はそれが分割されたMPI_Commを呼び出すのが正しいと確信していません。 fwiw、 'MPI_Comm_create_group()'はコミュニケータを作成するために使用でき、元のコミュニケータのサブセットであるグループのプロセスによってのみ呼び出されます。 –