Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的MPI程序输出不正确_C_Parallel Processing_Mpi - Fatal编程技术网

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

C 为什么我的MPI程序输出不正确,c,parallel-processing,mpi,C,Parallel Processing,Mpi,我是MPI的初学者,我有一个家庭作业。我不是要求你解决这个问题,我只需要一个提示,说明我的程序为什么会出故障 问题就在这里 编写一个模拟乒乓球桌面游戏的MPI C程序。2只应使用过程。进程使用MPI_Send和MPI_Recv连续地将消息反弹到彼此之间,具体次数为。消息由一个整数计数变量组成,该变量在发送前由每个进程递增。开始游戏之前,count变量被初始化为零 输出 一个名为ping_pong_output.txt的文本文件,如下例所示:if count=5 进程0启动游戏并初始化计数进程0增

我是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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
int size=0,my_rank=0,tag=1,count;
MPI_状态;
MPI_Init(&argc,&argv);
MPI_通信大小(MPI_通信世界和大小);
MPI通信等级(MPI通信世界和我的通信等级);
MPI_屏障(MPI_通信世界);
如果(我的排名==0){
计数=0;
计数++;
printf(“进程0启动游戏并初始化计数\n进程0增加计数并将其发送到进程1\n”);
MPI_发送(&count,1,MPI_INT,1,tag,MPI_COMM_WORLD);
}
MPI_屏障(MPI_通信世界);

虽然(计数对于可能正在寻找答案的任何人,我设法发现您应该让一个进程处理所有打印。

这是一种方法。您遇到的问题与输出刷新有关。使用printf将向stdout发送数据,但stdout不会立即刷新。因为每个列组都会在自己的时间刷新(在本例中,最有可能是在执行结束时),您将在最后获得所有内容,并且两个列组将被分组在一起。我所知道的保持程序原始结构的最简单解决方案是在每次printf调用后添加fflush(stdout)。这将强制刷新缓冲区,从而显示输出。

请参阅