2011-02-26 39 views
1

我正在构建一个简单的应用程序,它在三次迭代中构建一个逻辑圆,然后打印结果。首先,我正在使用来自进程0的阻塞Send和Recv,我使用Send和Recv,直到最终的n-1进程,该进程发送到进程0.在进程0中,我使用主代码:MPI - 进程的逻辑圆

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 ...仍然我不明白...感谢您的想法。

回答

3

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

+1击败我。 (我修改了你如何阻止的回复。) – chrisaycock

+0

@chrisaycock:啊; 'MPI_Waitall'似乎很熟悉。 :-) +1。 –

+0

只有第一个进程以MPI_Send开始,其他进程则以MPI_Recv开始,然后继续执行MPI_Send。它对我来说很奇怪,它只会做一次,然后什么都不做,即使它会一直做3次... – Waypoint