我正在尝试编写一个程序,其中进程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;
}
您应该确保发送和接收操作的数量相同。
在您的代码中,发送操作比接收操作多。因此,一个进程将会崩溃。
为避免这种情况,仅当您的标志不等于 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);
}