我有以下代码:
//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
)继续执行并执行程序的其余部分,因此主进程完成并且子进程被告知等待还在等待。
答案 0 :(得分:-2)
当您在MPI中发送/接收时,它是一个块。显然,接收线程/机器将一直等到收到数据。不明显的是发送线程/机器也将等待接收线程/机器确认收到。标准MPI发送/接收命令类似于TCP。 MPI发送/接收命令的无等待变体类似于UDP。您是否在使用具有超线程的多个内核的单台计算机上运行MPI?如果是这样,我认为正在发生的是线程执行的顺序导致阻塞。
鉴于您尝试将相同的信息发送到所有从属节点,您最好使用MPI_BROADCAST()命令。这将避免这个可能的问题。它还可以加快你的代码速度。 MPI_BROADCAST()依赖于编译器/实现,但通常编写它以利用已经收到信息的从属节点来加速整个过程。