2012-02-01 62 views
0

我的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 ... 

現在,若設爲i行改變101爲 「否則如果(nrank == 2)」 和我改變線94爲「2」,而不是「MPI_ANY_SOURCE」,然後我沒有得到任何信號捕獲在所有:

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)的行列的信號。