c - MPI 的竞争条件

标签 c mpi barrier

我正在尝试使用 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 已到达巴里

0 是第二轮的获胜者

1 是第 1 轮的失败者

1 条发送到达消息

2 是第一轮的获胜者

2 已收到:3 已到达巴里

2是第2轮的失败者

2发送到达消息

3是第一轮的失败者

3发送到达消息

0 已收到:2 已到达巴里

0 发送唤醒消息

0 发送唤醒消息

收到 1 条:来自 0 的唤醒消息,第 1 轮带有标签

收到 2 个:来自 0 的唤醒消息,第 2 轮带有标签

2发送唤醒消息

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

最佳答案

根据我的经验,您很可能存在观察问题,而不是底层算法的问题。通常,这种设置中的 printf 会无序到达。你必须

  • 在输出中添加时间戳
  • 写入不同的文件,每个 MPI 进程一个文件
  • 根据您的时间戳进行排序,将它们重新合并在一起

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

相关文章:

java - 将指针从 C 传递到 Java 变为 NULL

c - 存储和消除垃圾值

c++ - 将 MPI 结果写入文件

c - MPI Gather 没有按预期合并数组

c - 解决循环 typedef 依赖?

C wait() 确实有效

C++:使用 MPI Gatherv 连接不同长度的 vector

deadlock - 可重复使用的Barrier解决方案陷入僵局?

ios - 如何在swift 3中做障碍

webserver - MPI_SEND 在 MPI_BARRIER 之后停止工作