MPI - 流程的逻辑循环

时间:2011-02-26 18:55:20

标签: c mpi

我正在构建一个简单的应用程序,它在三次迭代中构建一个逻辑循环,然后打印结果。首先,我使用阻塞Send和Recv,从进程0开始,我使用Send和Recv,直到最后的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是实际进程的数量)收到并发送到排名+ 1 ......仍然我没有得到它...谢谢你想法。

1 个答案:

答案 0 :(得分:3)

MPI_Send可以选择等待接收方拨打MPI_Recv。因此,如果您的所有流程都是通过调用MPI_Send开始的,那么所有流程都会挂起。请尝试使用MPI_Isend,然后检查是否已使用MPI_Waitall收到每封邮件。

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

  1. 0发送到1并等待从2
  2. 接收
  3. 1从0接收,发送到2,然后退出
  4. 2从1接收,发送到0,然后退出
  5. 0从2接收,打印消息,然后退出
  6. 现在,再次重新插入循环。完全相同的事情将发生,除了过程0将在步骤4之后继续并将发送到进程1,已退出。尝试将循环插入else ifelse块,或者从if块中删除循环并将整个if / else if / else包裹在循环中。