我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
if在屏障之前移动两个语句会导致此程序正确运行.
编辑 - 似乎第一次通信,无论何种类型,都可以工作,并且所有未来的通信都会失败.这比我最初想的要宽泛得多.如果第一次通信是障碍或其他消息,则未来通信无法正常工作并不重要.