2017-06-10 15 views
2

私はこのコードがMPI_Bcast内部のif文

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

int main(int argc, char * argv[]){ 
    int my_rank, p, n; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &p); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 

    if(my_rank == 0){ 
     scanf("%d", &n); 
    } 

    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); 

    MPI_Finalize(); 
} 

しかし、このコードについて正しいことを知っています。私は誰かに尋ねたところ、議論に入り、彼はこのコードが完全に間違っていると私に言った。

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

int main(int argc, char * argv[]){ 
    int my_rank, p, n; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &p); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 

    if(my_rank == 0){ 
     scanf("%d", &n); 
     MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); 
    } 
    else { 
     MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); 
    } 

    MPI_Finalize(); 
} 

私はそれが効率的ではないことを知っていますが、なぜ間違っているのか理解できません。 私はすべてのプロセスが以下のプログラムのコピーをとり、それを処理することを理解しています。そのため、すべてがif文の外にあるかのようにMPI_Bcastを使用しますので、 if文の中でMPI_Bcastを使用しますか?

+0

それは完全に間違ったコードのようには見えません:)ちょっと少し違って:) – mko

+0

@mko技術的にその人は私の教授だったので、私は気づいていないことがあるかどうかを確認するように頼んだ。 –

+0

Hmmm ...正直言って、ここでは「完全に間違っている」と言うのは難しいです:(しかし、あなたがすでに知っていれば、私たちに知らせてください)すべてのプロセスは、とにかくMPI_Bcastを呼び出しています。 ) – mko

答えて

3

第1コードと第2コードは意味的に同等です。どちらも正しいMPIプログラムです。言っ

$ mpicc -S first.c -O3 
$ mpicc -S second.c -O3 
$ diff first.s second.s 
1c1 
< .file "first.c" 
--- 
> .file "second.c" 

は、最初のコードは、より良いバージョン..です最適化コンパイラはまったく同じアセンブリコードを作成します - あなたは簡単に両方コンパイルしていることを証明することができます。これはより簡単な制御フローを持ち、すべてのランクが障壁に入るという意味で正しいことを示す方が簡単です。それはMPIの集団を確実にするために重要なことです。コミュニケータ内のすべてのプロセスは、同じ順序でそれらを呼び出す必要があります。