MPI_Waitall挂起

时间:2014-05-07 03:47:43

标签: mpi openmpi

我有这个MPI程序挂起而没有完成。知道哪里出错了吗?可能是我遗漏了一些东西,但我想不出代码可能存在的问题。更改发送和接收的顺序也不起作用。 (但我猜测任何命令都会因为呼叫的非阻塞特性而发生。)

#include <mpi.h>

int main(int argc, char** argv) {

    int p = 2;
    int myrank;

    double in_buf[1];
    double out_buf[1];

    MPI_Comm comm = MPI_COMM_WORLD;
    MPI_Status stat;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(comm, &myrank);
    MPI_Comm_size(comm, &p);

    MPI_Request requests[2];
    MPI_Status statuses[2];

    if (myrank == 0) {
        MPI_Isend(out_buf,1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &requests[0]);
        MPI_Irecv(in_buf, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &requests[1]);
    } else {
        MPI_Irecv(in_buf, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &requests[0]);
        MPI_Isend(out_buf, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &requests[1]);
    }

    MPI_Waitall(2, requests, statuses);

    printf("Done...\n");

}

1 个答案:

答案 0 :(得分:4)

蝙蝠的权利看起来你的标签不匹配。 您从等级0发布isend,标签= 0但是从等级1发布irecv,标签= 1。

我假设您也启动了两个进程,对吧? int p = 2没有做任何有用的事情。