MPI не правильный порядок отправки и получения - PullRequest
0 голосов
/ 17 ноября 2018

Я использую MPI в этом коде, кольцо передачи сообщений между процессами, процесс n получает от n-1 и отправляет n + 1.

#include "mpi.h"
#include <stdio.h>

int main(argc,argv)
int argc;
char **argv;
{

  int MyProc, size,tag=1;
  char msg='A', msg_recpt;
  MPI_Status status;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &MyProc);
  MPI_Comm_size(MPI_COMM_WORLD, &size);

  printf("Process # %d started \n", MyProc);
  MPI_Barrier(MPI_COMM_WORLD);


  if(MyProc == 0){
      printf("Sending:  Proc #%d  to Proc #%d\n",MyProc,(MyProc +1 )%size);
      MPI_Send(&msg, 1, MPI_CHAR, (MyProc +1 )%size,tag, MPI_COMM_WORLD);
      MPI_Recv(&msg_recpt, 1, MPI_CHAR, (MyProc + size - 1)%size, tag, MPI_COMM_WORLD, &status);
      printf("Receving: Proc #%d from Proc #%d\n",MyProc,(MyProc + size - 1)%size);
  }else{
    printf("Receving: Proc #%d de Proc #%d\n",MyProc,(MyProc + size - 1)%size);
    MPI_Recv(&msg_recpt, 1, MPI_CHAR, (MyProc + size - 1)%size, tag, MPI_COMM_WORLD, &status);
    MPI_Send(&msg, 1, MPI_CHAR, (MyProc +1 )%size,tag, MPI_COMM_WORLD);
    printf("Sending:  Proc #%d  from Proc #%d\n",MyProc,(MyProc +1 )%size);
  }

  printf("Finishing proc %d\n", MyProc);

  MPI_Barrier(MPI_COMM_WORLD);
  MPI_Finalize();
}

и я получаю этот вывод:

Process # 0 started 
Process # 1 started 
Process # 2 started 
Sending:  Proc #0  to Proc #1
Receving: Proc #0 from Proc #2
Finishing proc 0
Receving: Proc #1 de Proc #0
Sending:  Proc #1  from Proc #2
Finishing proc 1
Receving: Proc #2 de Proc #1
Sending:  Proc #2  from Proc #0
Finishing proc 2

Что-то не так, потому что сообщение о получении процесса 0 появляется перед тем, как отправлять сообщение процесса 2, я думал, что process0 должен дождаться отправки процесса 2, но я не знаю, что происходит.

1 Ответ

0 голосов
/ 17 ноября 2018

Вы не можете предполагать, что, поскольку stdout дал вам приказ, это порядок операций.

Единственное, что вы можете сказать, это то, что на каждом ранге порядок соблюдается, а остальное -не.То, как MPI будет агломерировать стандартный вывод с каждого ранга, зависит от реализации (я думаю, что у Intel MPI есть флаг, который я больше не могу найти, что замедлит выполнение).

Если вы хотите убедиться в порядке операций, вы должны использовать что-то еще, кроме stdout, посмотрите на MPE, вампир ...

...