2012-02-01 8 views
0

my mpiプログラムは、ランク0を持っていて、データを受信する準備ができていることを知らせる他のランクからのメッセージを待ちます。この時点で、私のランク0はデータを送信します。残念ながら、それはランク1からの「準備完了」信号を捕まえるだけで、なぜ私は考えられないのですか?MPIプログラムのみがランク1のメッセージを取得する

73 if(nrank == 0) 
74 { 
75  for(int at = 0; at < 2; at++) 
76  { 
77  for(int l = 0; l <= Lmax; l++) 
78  { 
79   for(int m = -l; m <= l; m++) 
80   { 
81   rank_rdy = 0; 
82   /***************** 
83   * prep the data * 
84   *****************/ 
85   printf("----------------------------------------------\n"); 
86   printf("rank(0): generating data for (at, l, m) = (%i, %i, %i)\n", at, l, m); 
87   info_space[0] = at; 
88   info_space[1] = l; 
89   info_space[2] = m; 
90   read_d_grid(y_space, at, l, m); 
91 
92   /* wait for receiving signale */ 
93   printf("rank(0): waiting for ready signal ... \n"); 
94   rc = MPI_Recv(&rank_rdy, 1, MPI_INT, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &status); 
95   printf("rank(0): ready signal caught from rank %i\n", rank_rdy); 
96   MPI_Send(info_space, 1, MPI_INT, rank_rdy, tag, MPI_COMM_WORLD); 
97   } 
98  } 
99  } 
100 } 
101 else 
102 { 
103  int junk = 0; 
104  rank_rdy = nrank; 
105  tag = nrank; 
106  MPI_Send(&rank_rdy, 1, MPI_INT, 0, tag, MPI_COMM_WORLD); 
107  
108  printf("rank(%i): ready signal sent\n", nrank); 
109  // successful send 
110  MPI_Recv(info_space, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); 
111  
112  for(int i = 0; i < 900000000; i++) 
113  { 
114  junk = junk + i; 
115  } 
116  printf("rank(%i): done spinning\n"); 
117 } 

これの出力は次のとおりです:今

rank(0): inside getInputs: reading command line arguments 
rank(2): inside getInputs: reading command line arguments 
rank(3): inside getInputs: reading command line arguments 
rank(1): inside getInputs: reading command line arguments 
rank(0): inside read_r_grid(): reading meldrum.txt 
---------------------------------------------- 
rank(0): generating data for (at, l, m) = (0, 0, 0) 
rank(0): inside read_d_grid(y_space, 0, 0, 0) 
rank(2): inside read_r_grid(): reading meldrum.txt 
rank(3): inside read_r_grid(): reading meldrum.txt 
rank(1): inside read_r_grid(): reading meldrum.txt 
rank(0): waiting for ready signal ... 
rank(2): ready signal sent 
rank(3): ready signal sent 
rank(1): ready signal sent 
rank(0): ready signal caught from rank 1 
---------------------------------------------- 
rank(0): generating data for (at, l, m) = (0, 1, -1) 
rank(0): inside read_d_grid(y_space, 0, 1, -1) 
rank(0): waiting for ready signal ... 

、私は "(nrank == 2)であればそうでない" と線101を変更し、私は変更する場合は、ここで

コードです代わりに「MPI_ANY_SOURCE」の「2」、そして、私は任意の信号がすべてでキャッチ取得しないためにライン94:

rank(0): inside getInputs: reading command line arguments 
rank(3): inside getInputs: reading command line arguments 
rank(2): inside getInputs: reading command line arguments 
rank(1): inside getInputs: reading command line arguments 
rank(0): inside read_r_grid(): reading meldrum.txt 
rank(2): inside read_r_grid(): reading meldrum.txt 
rank(3): inside read_r_grid(): reading meldrum.txt 
rank(1): inside read_r_grid(): reading meldrum.txt 
---------------------------------------------- 
rank(0): generating data for (at, l, m) = (0, 0, 0) 
rank(0): inside read_d_grid(y_space, 0, 0, 0) 
rank(0): waiting for ready signal ... 
rank(2): ready signal sent 

はそう(0)単純に受信されていないというランクを知っていますランク(1)以外の人からの信号。誰かがランク1以外のランクが0にランクされない理由を知ることができますか?

答えて

1

私はばかだ...タグは1に初期化されているので、私は似たタグ(ランク1)を与えるランクからの信号しか受信していませんでした。

関連する問題