MPI GRAPH: отправка сообщений соседям, за исключением того, откуда они пришли

У меня тут забавная ситуация. Я пытаюсь иметь узел в графе для отправки сообщения всем своим соседям, кроме своего родителя (узел, который только что отправил сообщение). Код, который у меня есть, кажется, показывает, что этот конкретный узел ( 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 );
          }
    }

person Walker    schedule 09.10.2015    source источник
comment
Трудно сказать по последнему фрагменту кода, но есть ли у вас какой-то внешний цикл, который перебирает полученные сообщения и затем отправляет их одно за другим соответствующим соседям, или вы немедленно отправляете любое полученное сообщение, а затем возвращаетесь к MPI_Recv() ? Не могли бы вы добавить больше кода, чтобы лучше понять, что коды (не) делают?   -  person maddouri    schedule 10.10.2015
comment
Привет, спасибо. Я только что отредактировал код, у меня нет внешнего цикла. Я, кажется, понимаю ваш ход мыслей, хотя. Кажется, вы предлагаете мне поместить весь код в цикл, который повторяет cout_neighbours-1 раз?   -  person Walker    schedule 10.10.2015
comment
Да! Вероятно, следует использовать что-то вроде for (messageIdx = 0; messageIdx < TOTAL_NUMBER_OF_EXPECTED_MESSAGES; ++messageIdx) { MPI_Recv(); /* the for loop for sending to the neighbours */ }   -  person maddouri    schedule 10.10.2015
comment
Это логично, но после завершения код зависает. Несмотря на то, что он зависает только на 1-й итерации, все сообщения были получены.   -  person Walker    schedule 10.10.2015
comment
Поскольку у вас есть 6 соседей для узла 0, как насчет определения int 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


Ответы (1)


Вам нужен двойной for для работы, например:

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 );
          }
    }
}
person gsamaras    schedule 09.10.2015