MPI - транслировать всем процессам, чтобы что-то распечатать

Я объявил значение int в моем main, и все процессы инициализировали это значение. Все они хранят значение, которое я хочу вывести на экран после завершения вычислений. Является ли трансляция решением? Например. как реализовать?

int i;
int value;
  MPI_Status status;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
  MPI_Comm_rank(MPI_COMM_WORLD;&myrank);

  left =  (myrank - 1); if (left < 0) left = numtasks-1;
  right = (myrank + 1); if (right >= numtasks) right = 0;

if(myrank==0){
     value=value+myrank;
      MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);
      MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);

  }
  else if(myrank==(numtasks-1)){

      MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);
      value=value+myrank;
      MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);


  }
  else{
      MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);
      value=value+myrank;
      MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);
  }

Они должны составить логический круг. Делаю одно вычисление (сумма всех рангов), и в процессе 0 получаю результат. Этот результат (для 4 процессов будет 6) я хочу распечатать каждым из процессов после этого вычисления. Но я не вижу, как именно использовать барьер и где.

Есть еще одно но, после всех N-1 отправок (где N - количество процессов) у меня должна быть сумма всех рангов в каждом из процессов. В моем коде я получаю эту сумму только в процессе 0... Это может быть плохой подход :-(


person Waypoint    schedule 27.02.2011    source источник


Ответы (1)


Некоторые дополнительные сведения о структуре вашего кода помогут, но похоже, что вы можете просто использовать MPI_Barrier. Вашим процессам не нужно обмениваться какими-либо данными, им просто нужно подождать, пока все не достигнут точки в вашем коде, где вы хотите, чтобы произошла печать, что и делает Barrier.


РЕДАКТИРОВАТЬ: в опубликованном вами коде барьер будет идти в самом конце (после оператора if), за которым следует printf(value).

Однако ваш код не будет вычислять общую сумму всех рангов во всех узлах, поскольку процесс i получает только суммированные ранги первых i-1 процессов. Если вы хотите, чтобы в конце каждого процесса была общая сумма, то замена Barrier на Broadcast действительно лучший вариант. (На самом деле весь оператор if И Broadcast можно заменить одним вызовом MPI_Reduce(), но это не очень поможет вам изучить MPI. :))

person suszterpatt    schedule 27.02.2011
comment
Детали добавлены к основному вопросу - person Waypoint; 27.02.2011
comment
Спасибо, а не могли бы вы написать мне, как использовать трансляцию для моего кода? Из root=0 я отправляю во все остальные процессы, а после оператора if я помещаю какой-то цикл for? - person Waypoint; 27.02.2011
comment
Решено, добавил эти строки после цикла if: MPI_Bcast from root и printf. Спасибо - person Waypoint; 27.02.2011