MPI同步接收不起作用

时间:2018-05-17 22:46:15

标签: c mpi

我有以下代码:

//Sends the image dimensions to the other processes.
int* dims = malloc(2*sizeof(int));

if (0 == rank){
    image = readImage (argv[1]);
    dims[0] = image->width;
    dims[1] = image->height;
    for (int i = 1; i < processes; i++){
        printf("Sending dimensions to process %d\n", i);
        MPI_Send(&dims, 2, MPI_INT, i, 0, MPI_COMM_WORLD);
    }
} else {
    printf("Receiving dimensions.\n");
    MPI_Recv(&dims, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
    image->width = dims[0];
    image->height = dims[1];
    printf("Received width: %d, height: %d\n", dims[0], dims[1]);
}

问题是执行了receive命令,因此其中一个进程等待消息。然后,主进程发送数据。但是,接收永远不会完成。我已确认首先执行接收,然后执行发送。为什么这不能按预期工作?

编辑:调用MPI_Receive的进程挂起,而主进程(rank == 0)继续执行并执行程序的其余部分,因此主进程完成并且子进程被告知等待还在等待。

1 个答案:

答案 0 :(得分:-2)

当您在MPI中发送/接收时,它是一个块。显然,接收线程/机器将一直等到收到数据。不明显的是发送线程/机器也将等待接收线程/机器确认收到。标准MPI发送/接收命令类似于TCP。 MPI发送/接收命令的无等待变体类似于UDP。您是否在使用具有超线程的多个内核的单台计算机上运行MPI?如果是这样,我认为正在发生的是线程执行的顺序导致阻塞。

鉴于您尝试将相同的信息发送到所有从属节点,您最好使用MPI_BROADCAST()命令。这将避免这个可能的问题。它还可以加快你的代码速度。 MPI_BROADCAST()依赖于编译器/实现,但通常编写它以利用已经收到信息的从属节点来加速整个过程。