【问题标题】:MPI - logic circle of processesMPI - 流程的逻辑循环
【发布时间】:2012-03-07 04:01:26
【问题描述】:

我正在构建一个简单的应用程序,它在三个迭代中构建一个逻辑循环,然后打印结果。首先,我使用阻塞发送和接收,从进程 0,我使用发送和接收,直到最后的 n-1 个进程,它发送到进程 0。在进程 0 中,我在 main 中有这段代码:

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



if(myrank==0){


    for(i=0;i<3;i++){
      MPI_Send(msg,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD);
      MPI_Recv(msg,100,MPI_CHAR, numtasks-1,99,MPI_COMM_WORLD,&status);
      printf("hello");
    }
  }
  else if(myrank==(numtasks-1)){
     MPI_Recv(msg,100,MPI_CHAR,numtasks-2,99,MPI_COMM_WORLD,&status);
     MPI_Send(msg,100,MPI_CHAR,0,99,MPI_COMM_WORLD);

  }
  else{
     MPI_Recv(msg,100,MPI_CHAR,myrank-1,99,MPI_COMM_WORLD,&status);
     MPI_Send(msg,100,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD);
  }

我现在正在尝试获得 3 个结果,对吗?但我仍然只得到一个。其余代码很简单,对于 0 以外的进程,它们从 myrank-1 接收(myrank 是实际进程的数量)并发送到 rank+1 ......我还是不明白......谢谢你的想法。

【问题讨论】:

    标签: c mpi


    【解决方案1】:

    MPI_Send可以选择等待接收方调用MPI_Recv。因此,如果您的所有进程都从调用MPI_Send 开始,它们都会挂起。尝试改用MPI_Isend,然后检查是否已使用MPI_Waitall 收到每条消息。

    编辑:我不知道我是如何设法忽略第一个if 块中有一个循环的事实... *尴尬*。我想我过于关注 MPI 部分。尝试运行代码没有循环(但循环体仍然存在);那么它应该按预期工作(例如,n = 3 个进程):

    1. 0 发送到 1 并等待从 2 接收
    2. 1从0接收,发送到2,退出
    3. 2从1接收,发送到0,退出
    4. 0 从 2 接收,打印消息,然后退出

    现在,再次重新插入循环。完全相同的事情将会发生,除了进程 0 将在第 4 步之后继续,并将发送到进程 1,它已经退出。尝试在else ifelse 块中也插入循环,或者从if 块中删除循环并将整个if / else if / else 包装在一个循环中。

    【讨论】:

    • +1 打败我。 (我修改了您对如何阻止的回复。)
    • @chrisaycock:啊; MPI_Waitall 似乎很熟悉。 :-) +1。
    • 只是第一个进程以 MPI_Send 开始,其他进程以 MPI_Recv 开始,然后继续以 MPI_Send。这对我来说很奇怪,它只会做一次然后什么都不做,即使它应该去 3 次......
    • @Hmyzak:奇怪;那么它应该可以工作。你能发布其他进程的代码吗?
    • @Hmyzak:奇怪;它对我来说看起来是正确的(尽管我已经有一段时间没有编写 MPI 代码了)。但是,您在显示的内容下方还有其他代码吗?你在else ifelse 分支中没有printf,所以如果这是所有代码,那么即使它们收到消息,其他进程也不会打印任何内容......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多