2016-07-30 4 views
0

このpostで提起された問題を再現しようとしました。以下は私のコードです。答えによると、すべてのプロセスが独立して実行されるので、プロセス1ではglobal_variableが0になるはずです。しかし、プロセス1も1000を出力します。したがって、プロセスはMPI_Initで生成されるため、MPI_Init、作成されたプロセスは同じ値を取得します。私はその投稿を誤解していますか?MPIとそのグローバル変数

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

static int global_variable; 

main(int argc, char **argv) 
{ 
    int ierr, num_procs, my_id; 

    global_variable = 1000; 

    ierr = MPI_Init(&argc, &argv); 

    /* find out MY process ID, and how many processes were started. */ 

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 

    if(my_id == 0) { 
     printf("%d\n", global_variable); 
    } 
    else if(my_id == 1) { 
     printf("%d\n", global_variable); 
    } 

    ierr = MPI_Finalize(); 
} 
+0

あなたがそれらを使用していない場合、なぜそれらのすべての 'ierr'戻り値を格納しているのでしょうか? – Kusalananda

+1

コメントに@Kusalanandaの点があります。さらに、ファイルI/Oに関連しないMPI呼び出しのデフォルトエラーハンドラはジョブ全体を終了させるので、 'MPI _... 'ルーチンは' MPI_SUCCESS'を返すか、まったく返しません。 'MPI_ERRORS_RETURN'エラーハンドラが**明示的に**設定されていない限り、それはです。 –

答えて

1

これはどのような独立した手段である。ここでは

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

static int global_variable; 

int main(int argc, char **argv) 
{ 
    int ierr, num_procs, my_id; 
    ierr = MPI_Init(&argc, &argv); 

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 

    if (my_id == 0) { 
     global_variable = 1000; 
    } 
    MPI_Barrier(MPI_COMM_WORLD); 
    printf("%d\n", global_variable); 

    ierr = MPI_Finalize(); 
} 

、唯一のプロセス0がglobal_variableを変更します。あなたの例では、global_variable = 1000;行はどのプロセスにも固有ではなく、すべてのプロセスがそれを実行します。

+0

ご返信ありがとうございます。以前私は誤解していました。私は、新しく作成されたプロセスがMPI_Initの直後からプログラムを実行すると考えました。しかし、あなたの答えによれば、 "すべてのプロセスはglobal_variable = 1000"を実行します。これはすべてのプロセスがmain()の先頭からプログラムを実行することを意味します。どうもありがとう。 – HuangJie

+2

@HuangJie、実質的にすべての実動レベルのMPI実装は、各MPIランクに対して別々のOSプロセスを使用します。つまり、ランクは 'main()'から始まるプログラムコード全体を実行します。それでも、そのような振る舞いは、共有グローバル変数のようなすべての結果と共にスレッドを使用するMPI標準と実装では必須ではありません。 –