0

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

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);
    }
}
4

1 回答 1

4

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

因此,通常如果施加基于等级的条件,则有一些过程可以满足,也有一些过程不能满足。因此,两个分支都被执行,但在不同的进程中并且可能在不同的时间执行。

在 MPI 中编程需要一些人格分裂思维,而且通常需要一些时间来适应。

于 2012-08-24T15:08:49.197 回答