У меня здесь смешная ситуация. Я пытаюсь создать узел в графе для отправки сообщения всем своим соседям, кроме своего родителя (узла, который только что отправил сообщение). Код, который я имею, показывает, что этот конкретный узел (n) получает сообщения от всех своих соседей (правильно). Проблема заключается в отправке, отправляется только первое поступившее сообщение. Все остальные игнорируются.
NB. Это топология типа «звезда», все остальные узлы отправляются на центральный узел 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 6Having 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 );
}
}
Вам нужен двойник для работы, как это:
int j;
for(j = 0; j < neighbourcount; ++j) {
for ( int l = 0 ; l< neighbourcount ; l++ ){
int current_neighbour = neighbours[l];
if ( current_neighbour != parent ){
MPI_Send(/*send j*/ , 1 , MPI_INT , current_neighbour , tag, COMM );
}
}
}
Других решений пока нет …