Программа MPI только ловит сообщение с рангом 1 - PullRequest
0 голосов
/ 01 февраля 2012

Предполагается, что моя MPI-программа имеет ранг 0, ожидающий сообщения от других рангов, которые сообщают ей, что они готовы к получению данных.в этот момент мой ранг 0 отправит ему данные.к сожалению, он только ловит «готовые» сигналы с ранга 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 ...

Теперь, если я изменяю строку 101 на «else if (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

, поэтому знайте, что rank (0) просто не получает никаких сигналов от кого-либо, кроме rank (1).Кто-нибудь может увидеть причину, по которой ранги, отличные от ранга 1, не достигли бы ранга 0?

1 Ответ

1 голос
/ 01 февраля 2012

я - идиот ... тег был инициализирован в 1, таким образом я только получал сигналы от рангов, дающих подобные теги (ранг 1).

...