C 为什么我的MPI程序没有按预期打印

C 为什么我的MPI程序没有按预期打印,c,parallel-processing,mpi,C,Parallel Processing,Mpi,我试图让一个进程处理所有printf操作,以便按照我想要的顺序进行打印。我试图存储进程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

我试图让一个进程处理所有printf操作,以便按照我想要的顺序进行打印。我试图存储进程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);
        }
charstr3[33];
char-str4[66];
MPI_屏障(MPI_通信世界);

(count首先,请注意,正如@grancis所指出的,由于死锁,您的代码似乎有缺陷,因为在发送之前,进程0和进程1都会在MPI_recv中阻塞。可能是您在输入问题中显示的代码片段之前发送数据,从而允许代码继续

无论如何,问题是缓冲区str3和str4是由进程1修改的,因此当进程0尝试打印它们时,它不能明显打印与这些缓冲区最初包含的内容不同的内容(在第一次迭代之前,这些缓冲区在代码中是未初始化的内存,在使用memset之后的后续迭代中是零)。请记住,在MPI中,进程不共享内存


如果您不希望进程1打印信息,那么进程1必须将其信息发送到进程0(通过MPI1中的普通MPI_发送/MPI_接收,或通过MPI2或MPI3中的单边通信),并且只有进程0才能打印该信息。

为什么
MPI_接收()操作在
MPI_发送()之前是
操作
?您的程序是否正确终止?因为我预计会出现死锁,因为
MPI_Recv()
会一直阻塞,直到它收到一条永远不会发送的消息…是的,它确实正确终止。谢谢,我听了您的话,它正常工作了。您也是正确的,我在循环之前第一次发送数据。