2012-02-01 2 views
0

내 mpi 프로그램은 순위 0이 있어야 데이터를받을 준비가되었음을 알리는 다른 순위의 메시지를 기다리게됩니다. 이 시점에서 내 순위 0은 데이터를 보냅니다. 불행히도, 그것은 오직 순위 1에서 'ready'신호를 포착하고 나는 그 이유를 모른다! 이 "다른 경우 (nrank == 2)"난 변경 제가 라인 (101)을 변경하면,MPI 프로그램은 순위 1의 메시지 만받습니다.

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

지금 :

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 } 

이것의 출력은 여기

는 코드 "2"대신 "MPI_ANY_SOURCE"에, 그럼 내가 어떤 신호를 얻을하지 않습니다하는 라인 (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)를주는 순위의 신호 만 수신했습니다.