【问题标题】:MPI not correct order of sending and receivingMPI 发送和接收的顺序不正确
【发布时间】:2019-04-20 09:57:12
【问题描述】:

我在这段代码中使用 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 发送消息之前,我认为进程 0 应该等到进程 2 发送,但我不知道发生了什么。

【问题讨论】:

  • 您是如何运行您的应用程序的?你对你的输出排序了吗?因为输出可以在没有附加标志的情况下交错到 mpirun。
  • 我以这种方式运行应用程序mpirun -np 3 ./app
  • edit将这些重要信息放入问题中。另外,哇,人们还在新代码中使用甚至是 pre-ISO C?这有什么正当理由吗?我认为很多人无法从 C89/C90 继续前进已经够糟糕了,但是......
  • Ordering Output in MPI的可能重复

标签: c mpi


【解决方案1】:

你不能假设因为标准输出给了你一个命令,那就是操作的顺序。

您唯一可以说的是,在每个等级上,顺序都受到尊重,但其余的则不。 MPI 如何聚合每个等级的标准输出取决于实现(我认为英特尔 MPI 有一个我再也找不到的标志会减慢执行速度)。

如果你想确定操作的顺序,你必须使用标准输出以外的东西,看看 MPE,吸血鬼......

【讨论】:

  • 为什么stdout没有给出操作顺序?
  • 因为来自 mpirun 的标准输出不是来自您的各个进程的标准输出。它们被 mpirun 聚集并变成标准输出。但是没有指定顺序以便最大化性能。
猜你喜欢
  • 2011-01-02
  • 2013-04-15
  • 2018-03-12
  • 2021-12-30
  • 2013-12-20
  • 2016-06-15
  • 2012-03-13
  • 2016-10-03
  • 1970-01-01
相关资源
最近更新 更多