为什么我的MPI程序不能按原样打印

时间:2014-04-13 13:22:37

标签: c parallel-processing mpi

我试图让一个进程处理所有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);
        }

1 个答案:

答案 0 :(得分:1)

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

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

如果您不希望进程1打印信息,则进程1必须将其信息发送到进程0(通过MPI1中的普通MPI_Send / MPI_Recv或MPI2或MPI3中的单向通信),然后进程0才能打印出来信息。