我试图让一个进程处理所有printtf操作,以便按我想要的顺序进行打印。我试图存储进程1生成的数据,让进程0打印进程0和进程1生成的数据,但我只得到正在生成的进程0。
以下是代码的相关部分
char str3[33];
char str4[66];
MPI_Barrier(MPI_COMM_WORLD);
while (count<5){
MPI_Recv(&count,1,MPI_INT,(my_rank+1)%2,tag,MPI_COMM_WORLD,&status);
char str[30];
if(my_rank==0)
sprintf(str,"Process %d received the count\n",my_rank);
if(my_rank==1)
sprintf(str3,"Process %d received the count\n",my_rank);
count++;
char str2[66];
if (my_rank==0)
sprintf(str2,"Process %d incremented the count(%d) and sent it back to process %d\n",my_rank,count,(my_rank+1)%2);
if (my_rank==1)
sprintf(str4,"Process %d incremented the count(%d) and sent it back to process %d\n",my_rank,count,(my_rank+1)%2);
if(my_rank==0){
printf(str3);
printf (str4);
printf(str);
printf(str2);
memset(str3,'\0',sizeof(str3));
memset(str4,'\0',sizeof(str4));
memset(str,'\0',sizeof(str));
memset(str2,'\0',sizeof(str2));
}
MPI_Send(&count,1,MPI_INT,(my_rank+1)%2,tag,MPI_COMM_WORLD);
}
答案 0 :(得分:1)
首先,请注意,正如@grancis所指出的,由于死锁,您的代码似乎存在缺陷,因为在发送之前,进程0和1都在MPI_recv中阻塞。可能是您在输入问题中显示的代码段之前发送数据,允许代码继续。
无论如何,问题是缓冲区str3和str4被进程1修改,所以当进程0尝试打印它们时,它显然不能打印出与这些缓冲区最初包含的内容不同的东西(这是代码中未初始化的内存)在第一次迭代之前,在你使用memset之后的后续迭代中为零。请记住,在MPI流程中,请勿共享内存。
如果您不希望进程1打印信息,则进程1必须将其信息发送到进程0(通过MPI1中的普通MPI_Send / MPI_Recv或MPI2或MPI3中的单向通信),然后进程0才能打印出来信息。