我正在尝试做一个程序,其中进程0应该开始初始化将消息发送到除自身之外的随机进程,然后选择的随机进程应该接收消息并发送到另一个随机进程。这应该发生,直到所请求的要发送的消息数完成,这由用户作为输入给出。我看到我的程序要么以最大2发送消息,要么甚至没有,并给我以下错误
**其中一个程序终止:清理 使用退出字符串终止的应用程序:已终止(信号15)
**
这是我的代码,知道它的循环孔是什么。随机生成部分不包括在内,工作正常
if(rank==0)
{
rnum=rgenerator(rank,size);
string++;
MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD);
printf("\n process %d sends message to process %d",rank, rnum);
//MPI_Recv(&flag, 100, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
}
while(flag!=1)
{
if(MPI_Recv(&string, 50, MPI_INT, MPI_ANY_SOURCE, rank, MPI_COMM_WORLD, &status)==MPI_SUCCESS)
{
printf("\n process %d receives message from process %d count : %d",rank, status.MPI_SOURCE, string);
rnum=rgenerator(rank,size);
printf("\n Random num generated is %d",rnum);
string=string+1;
MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD);
count++;
printf("\n process %d sends message to process %d", rank, rnum);
//MPI_Bcast(&count, 40, MPI_INT, rank, MPI_COMM_WORLD);
if(string==n)
{
printf("\n\n Messages reached");
flag=1;
}
}
else
flag=0;
}
答案 0 :(得分:1)
您应确保具有相同数量的send和recv操作。在你的代码中,你比一个recv操作更多的是发送操作。因此,一个过程将崩溃。
要避免这种情况,只有在您的旗帜不等于1时才需要发送:
//MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD);
count++;
printf("\n process %d sends message to process %d", rank, rnum);
//MPI_Bcast(&count, 40, MPI_INT, rank, MPI_COMM_WORLD);
if(string==n)
{
printf("\n\n Messages reached");
flag=1;
}
if(flag!=1){//make sure that you need to send one message.
MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD);
}