MPI - трансляция всем процессам для печати чего-либо - PullRequest
1 голос
/ 27 февраля 2011

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

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 ... Это может быть плохой подход: - (

1 Ответ

1 голос
/ 27 февраля 2011

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


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

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

...