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 점을 통과하지 못하는 이유를 볼 수 있습니까?