У меня тут забавная ситуация. Я пытаюсь иметь узел в графе для отправки сообщения всем своим соседям, кроме своего родителя (узел, который только что отправил сообщение). Код, который у меня есть, кажется, показывает, что этот конкретный узел ( n ) действительно получает сообщения от всех своих соседей (правильно). Проблема заключается в отправке, отправляется только первое пришедшее сообщение. Все остальные игнорируются. Примечание. Это топология «звезда», в которой все остальные узлы отправляют сообщения центральному узлу 0. Вот пример вывода: –
0 received 1 from 1
0 received 2 from 2
0 received 3 from 3
0 received 4 from 4
0 received 5 from 5
0 received 6 from 6
Having correctly received these values, node zero(0 ) is expected to send each message to all others in the following pattern i.e. :-
0 sent 1 to 2
0 sent 1 to 3
0 sent 1 to 4
0 sent 1 to 5
0 sent 1 to 6
,
0 sent 2 to 1
0 sent 2 to 3
0 sent 2 to 4
0 sent 2 to 5
0 sent 2 to 6
,
0 sent 3 to 2
0 sent 3 to 1
0 sent 3 to 4
0 sent 3 to 5
0 sent 3 to 6
, etc .
К сожалению, я получаю иначе, только первое сообщение отправляется другим узлам, а остальные игнорируются, т.е. если 1 сначала получено 0, я получаю только следующий вывод: -
0 sent 1 to 2
0 sent 1 to 3
0 sent 1 to 4
0 sent 1 to 5
0 sent 1 to 6
Все остальные сообщения не отправляются.
Вот как выглядит код в центральном узле топологии звездного графа:
MPI_Recv(&message , 1 , MPI_INT , MPI_ANY_SOURCE , echo_tag, COMM, &status );
//Sending just received message to neighbors, except to parent :-
parent = status.MPI_SOURCE;
for ( int l = 0 ; l< neighbourcount ; l++ ){
int current_neighbour = neighbours[l];
if ( current_neighbour != parent ){
MPI_Send(&message , 1 , MPI_INT , current_neighbour , tag, COMM );
}
}
MPI_Recv()
? Не могли бы вы добавить больше кода, чтобы лучше понять, что коды (не) делают? - person maddouri   schedule 10.10.2015for (messageIdx = 0; messageIdx < TOTAL_NUMBER_OF_EXPECTED_MESSAGES; ++messageIdx) { MPI_Recv(); /* the for loop for sending to the neighbours */ }
- person maddouri   schedule 10.10.2015int message[6];
и вызоваMPI_Recv(message , 6, MPI_INT , MPI_ANY_SOURCE , echo_tag, COMM, &status );
только один раз перед входом во внешний цикл for? Кроме того, вам может понадобиться изменить вызовMPI_Send()
на что-то вродеMPI_Send(&message[messageIdx] , 1 , MPI_INT , current_neighbour , tag, COMM );
. Как упоминалось здесь, вам, вероятно, следует использоватьMPI_Get_count()
для получения фактическийTOTAL_NUMBER_OF_EXPECTED_MESSAGES
перед входом во внешний цикл for. - person maddouri   schedule 10.10.2015