2012-08-24 45 views
0

控制如何从MPI_Send()直接跳转到MPI_Recv()else if。 就决策条件而言,它应该只执行一个代码块。MPI的执行流程

int main(int argc, char *argv[]) { 
    int number = 54; 
    MPI_Init(&argc, &argv); 
    MPI_Comm_size (MPI_COMM_WORLD, &no_of_process); 
    MPI_Comm_rank (MPI_COMM_WORLD, &process_rank); 
    MPI_Status status; 
    if (process_rank == 0) { 
     MPI_Send (&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); 
    } 
    else if (process_rank == 1) { 
     MPI_Recv (&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); 
    } 
} 
+0

好吧,简而言之,它不应该在单个线程中执行这两个块,但是如果涉及多个进程或线程,它可能会像这样做。你能举个例子说明你的意思吗? –

+2

在看不到代码的情况下回答这个问题是非常困难的。第一个难点是正确理解你的问题。 –

+0

@HighPerformanceMark我用一段简单的代码编辑了我的问题,希望这有助于理解我想问的问题。 – droidlabour

回答

3

MPI的执行模型或者是SPMD(单程序多数据)或MPMD(多程序多数据)与SPMD更加普遍。在这个执行模型中,从单一源代码产生一个二进制文件,然后启动多个实例,称为进程。每个实例都有自己的标识符,称为等级,并根据等级执行代码的不同分支。因此,MPI_Send由一个等级执行(“等级”通常用作“具有给定等级的过程”的短版本),而MPI_Recv由另一等级执行并且如果MPI_Send指定已经执行的过程的等级MPI_Recv,那么这个消息是在两者之间发送的。 MPI还允许消息缓冲和非阻塞操作,因此一个等级也可以与自己交谈。

所以通常情况下,如果一个有条件的,基于等级的强加,有一些过程令人满意,有些过程不适用。因此两个分支都可以在不同的过程中执行,但可能在不同的时间执

在MPI中编程需要一点思维分裂,通常需要一段时间才能习惯。

+0

在上面扩展我的评论,但是@HristoIliev对一个严重问题提出了一个很好的答案。 –

+0

@HighPerformanceMark,我刚从修理店拿回水晶球。我很高兴它的工作! –