【发布时间】:2012-05-15 00:26:55
【问题描述】:
我正在使用 C/MPI 构建分布式 Web 服务器,在我的代码中的第一个 MPI_BARRIER 之后,点对点通信似乎完全停止工作。标准 C 代码在屏障之后工作,所以我知道每个线程都会通过屏障。点对点通信在障碍之前也可以正常工作。但是,当我将与屏障之前的行相同的代码复制粘贴到屏障之后的行中时,它会完全停止工作。 SEND 将永远等待。当我尝试改用 ISEND 时,它会通过线路,但从未收到过消息。我一直在谷歌上搜索这个问题,每个对 MPI_BARRIER 有问题的人都被告知屏障正常工作,他们的代码是错误的,但我终生无法弄清楚为什么我的代码是错误的。什么可能导致这种行为?
下面是一个演示这个的示例程序:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int procID;
int val;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &procID);
MPI_Barrier(MPI_COMM_WORLD);
if (procID == 0)
{
val = 4;
printf("Before send\n");
MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD);
printf("after send\n");
}
if (procID == 1)
{
val = 1;
printf("before: val = %d\n", val);
MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
printf("after: val = %d\n", val);
}
MPI_Finalize();
return 0;
}
将两个if 语句移到屏障前会导致该程序正确运行。
编辑 - 似乎第一次通信,无论类型如何,都有效,并且所有未来的通信都失败了。这比我一开始想的要笼统得多。不管第一次通信是障碍还是其他消息,以后的通信都不会正常工作。
【问题讨论】:
-
您发布的代码对我来说看起来不错。您使用的是哪个版本的 MPI?
-
使用 openmpi 1.5.5 对我来说很好。
-
我知道它是 openmpi,但我似乎无法弄清楚是什么版本号。有命令告诉你吗?
-
mpirun --version会给你openmpi的版本 -
@TEOUltimus:“当两者在同一台机器上时它可以工作,而当它们在不同的机器上时会中断。”这听起来像是网络配置错误,消息无法到达目标机器。
标签: webserver mpi distributed send barrier