gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:35:09 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于c - 为什么我的 MPI 程序没有按预期打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23043266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com