我是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
请注意以下事项:
我写的代码
#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都可能没用,但它们绝望了。 任何帮助表示赞赏。
答案 0 :(得分:1)
对于那些可能正在寻找答案的人,我设法发现你应该让一个进程处理所有打印。
答案 1 :(得分:0)
这是一种方法。您遇到的问题与输出刷新有关。使用printf会将数据发送到stdout,但是stdout不会立即刷新。由于每个等级将在其自己的时间刷新(在这种情况下最有可能在执行结束时),所以最终会得到所有内容,并且两个等级将被组合在一起。我知道哪个最简单的解决方案将保持程序的原始结构是在每次printf调用后添加fflush(stdout)。这会强制缓冲区刷新,这将显示输出。