2013-05-21 7 views
8

におけるグローバル変数の定義:一つは気付くことができるよう私は次のサンプルコードを書かれているMPI

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

double x; 

int main (int argc, char **argv) { 
    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    if (rank==0) x=10.1; 

    MPI_Barrier(MPI_COMM_WORLD); 
    printf("%f\n", x); 

    MPI_Finalize(); 
    return 0; 
} 

を、このプログラムは、実際には、Xと呼ばれるグローバル変数を定義し、ゼロ番目のスレッドは、それにいくつかの値を代入しようとします。各スレッドは、変数xのアドレス、すなわちを出力するように私は私のコードを変更するより興味深い

10.1 
0 
0 
0 

、:私は4つのコアのSMP(対称型マルチプロセッシング)マシン上で、このプログラムの実行を持っているとき、私は次のような結果を得ます& x、それらはすべて同じものを印刷します。

私の質問は、SMPシステム上のいくつかのスレッドが同じ値を共有していない間に変数のアドレスに同じ値を共有する可能性があることです。

私の次の質問は、上記のコードをどのように変更して次の結果が得られるかです。

10.1 
10.1 
10.1 
10.1 
+2

本当にスレッドではなくプロセスなので、変数はおそらく同じアドレスと異なる値を持ちますか? –

+0

@Joachim:プロセスやスレッドであるかどうかを知るにはどうすればよいですか? – Mehrdad

+1

現在のMPI実装では、各ランクは別のプロセスです。 –

答えて

5

あなたは、ブロードキャストを使用することができます。

MPI_Bcast(&x,1,MPI_DOUBLE,0,MPI_COMM_WORLD); 

この意志は、他のすべてのプロセスにプロセス0でxの値を送りました。

+1

上記の関数呼び出しの0は、ブロードキャストを開始するプロセスのランクです。あなたが言ったように、xの値を変更するルートプロセスです。なぜこのパラメータが0であるのかということです.MPI_Bcastはブロックルーチンです。コミュニケータ内のすべてのプロセス(この場合はMPI_COMM_WORLD)は、関数を続行する前にMPI_BCast()を呼び出す必要があります。 – Madsen

関連する問題