gpt4 book ai didi

c - 与 MPI 的竞争条件

转载 作者:行者123 更新时间:2023-12-04 06:10:29 25 4
gpt4 key购买 nike

我正在尝试使用 MPI 实现锦标赛障碍。在这里,是我写的代码。我只写到达阶段和唤醒阶段

//Arrival phase
while(1)
{
if((!strcmp(round[my_id][round_num].role,"winner"))||(!strcmp(round[my_id][round_num].role,"champion")))
{
printf("%d is the winner of round %d\n",my_id,round_num);
MPI_Recv(&reach_msg, sizeof(reach_msg), MPI_BYTE, round[my_id][round_num].opponent, tag, MPI_COMM_WORLD, &status);
printf("%d received: %s\n",my_id,reach_msg);
}

else if(!strcmp(round[my_id][round_num].role,"loser"))
{
printf("%d is the loser of round %d\n",my_id,round_num);
sprintf(reach_msg,"%d arrived at the barrier",my_id);
MPI_Send(reach_msg,strlen(reach_msg+1),MPI_BYTE,round[my_id][round_num].opponent,tag,MPI_COMM_WORLD);
MPI_Recv(wakeup_msg,sizeof(wakeup_msg),MPI_BYTE,round[my_id][round_num].opponent,tag,MPI_COMM_WORLD,&status);
printf("%d received: %s\n",my_id,wakeup_msg);
}

if(round_num==num_rounds)
break;
else
round_num++;
}

printf("%d is out of arrival tree\n",my_id);

//wakeup tree
while(1)
{
printf("%d prints: round num is: %d\n",my_id,round_num);
if(round_num==0)
break;
sprintf(wakeup_msg,"wakeup msg from %d of %d",my_id,P);

if((!strcmp(round[my_id][round_num].role,"winner"))||(!strcmp(round[my_id][round_num].role,"champion")))
MPI_Send(wakeup_msg,strlen(wakeup_msg+1),MPI_BYTE,round[my_id][round_num].opponent,tag,MPI_COMM_WORLD);
round_num--;
}

MPI_Finalize();
return 0;
}

我不明白为什么会出现竞争条件。我相信 MPI_Send 和 MPI_Recv 是阻塞函数。但是,有时它不会那样做

编辑 :这是发生竞争条件的示例输出。如您所见,0 甚至在 1 发送消息之前就收到了来自 1 的消息(“1 到达屏障”)。

0 是第一轮的获胜者

0 收到:1 到达了barrie

0 是第 2 轮的获胜者

1是第一轮的输家

1 发送到达消息

2 是第一轮的获胜者

2 已收到:3 已到达巴里

2 是第二轮的输家

2 发送到达 msg

3是第一轮的输家

3 发送到达 msg

0 收到:2 到达了barrie

0 发送唤醒消息

0 发送唤醒消息

1 收到:从 0 唤醒消息,在第 1 轮带有标记

2 收到:第 2 轮带有标记的 0 唤醒消息

2 发送唤醒消息

3 收到:第 1 轮带有标签的 2 唤醒消息

最佳答案

对于调试 mpi 程序,打印语句通常不是一个很好的解决方案。因为打印语句需要通过网络从不同的节点发送到控制台并在之前缓存。

要调试它,您应该让每个处理器写入自己的输出文件。或者只让一个处理器打印语句,您可以通过使用 std::cerr 或以某种方式禁用 printf 的缓存来禁用缓存。

关于c - 与 MPI 的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7845485/

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