为什么我的MPI程序输出不正确

时间:2014-04-08 17:03:04

标签: c parallel-processing mpi

我是MPI的新手,我有作业,我不是要求你解决它,我只需要提示我的程序出现故障的原因。

这是问题

编写一个模拟乒乓球桌游戏的MPI C程序。只应使用2个过程。 进程使用MPI_Send和MPI_Recv不断地将消息反馈给彼此,特定的 次数。该消息由整数计数变量组成,该变量由每个变量递增 发送前的过程。在开始游戏之前,count变量初始化为零。

输出

一个名为ping_pong_output.txt的文本文件,如下例所示:if count = 5

  

进程0启动游戏并初始化计数进程0   递增计数(1)并将其发送到进程1

     

处理收到计数处理0递增计数(2)&   将其发回过程0

     

处理收到计数处理0递增计数(3)&   将其发回过程1

     

处理收到计数处理0递增计数(4)&   将其发回过程0

     

处理收到计数处理0递增计数(5)&   将其发回过程1

请注意以下事项:

  • 流程轮流为发送方和接收方(需要使用%)
  • 程序应该只允许2个进程玩游戏

我写的代码

#include <stdlib.h>
#include <stdio.h>
#include <mpi.h>
#include <time.h>

int main(int argc, char * argv[]){

        int size=0,my_rank=0,tag=1,count;
        MPI_Status status;
        MPI_Init(&argc,&argv);
        MPI_Comm_size(MPI_COMM_WORLD,&size);
        MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
        MPI_Barrier(MPI_COMM_WORLD);

        if (my_rank==0){
                count=0;
                count++;
         printf("Process 0 started the game and initialized the count\nProcess 0 incremented the count and sent it to process 1\n");

         MPI_Send(&count,1,MPI_INT,1,tag,MPI_COMM_WORLD);


                }
        MPI_Barrier(MPI_COMM_WORLD);
        while (count<=5){
                MPI_Barrier(MPI_COMM_WORLD);

                MPI_Recv(&count,1,MPI_INT,(my_rank+1)%2,tag,MPI_COMM_WORLD,&status);
                printf("Process %d received the count\n",my_rank);

                count++;
                MPI_Send(&count,1,MPI_INT,(my_rank+1)%2,tag,MPI_COMM_WORLD);
                printf("process %d incremented the count (%d) & sent it back to process %d\n",my_rank,count,(my_rank+1)%2);
        }

                MPI_Finalize();
                return 0;
}

我得到的输出是:

  

流程1收到了计数

     

过程1递增计数(2)&amp;将其发回过程0

     

流程1收到了计数

     

过程1递增计数(4)&amp;将其发回过程0

     

流程1收到了计数

     

过程1递增计数(6)&amp;将其发回过程0

     

进程0启动游戏并初始化计数

     

进程0递增计数并将其发送到进程1

     

流程0收到了计数

     

进程0递增计数(3)&amp;将其发回过程1

     

流程0收到了计数

     

进程0递增计数(5)&amp;将其发回过程1

     

流程0收到了计数

     

进程0递增计数(7)&amp;将其发回过程1

我不明白为什么进程1先运行,循环甚至在if语句之前运行。所有那些MPI_Barrier都可能没用,但它们绝望了。 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

对于那些可能正在寻找答案的人,我设法发现你应该让一个进程处理所有打印。

答案 1 :(得分:0)

这是一种方法。您遇到的问题与输出刷新有关。使用printf会将数据发送到stdout,但是stdout不会立即刷新。由于每个等级将在其自己的时间刷新(在这种情况下最有可能在执行结束时),所以最终会得到所有内容,并且两个等级将被组合在一起。我知道哪个最简单的解决方案将保持程序的原始结构是在每次printf调用后添加fflush(stdout)。这会强制缓冲区刷新,这将显示输出。