代码之家  ›  专栏  ›  技术社区  ›  whatnick

带MPI的循环处理(关闭一个/一些)

  •  1
  • whatnick  · 技术社区  · 15 年前

    我有一个MPI实现,基本上是在一组稀疏采样点上实现基于IDW2的网格划分。我把工作分成如下几部分:

    1. 所有的节点都读取所有的数据,最后一个节点不需要任何东西。
    2. Node0获取每个数据点并用以下代码发送到节点1…N-1:

      int nodes_in_play = NNodes-2;
      for(int i=0;i < data_size;i++)
      {
          int dest = (i%nodes_in_play)+1;
          //printf("Point %d of %d going to %d\n",i+1,data_size,dest);
          Error = MPI_Send(las_points[i],3,MPI_DOUBLE,dest,PIPE_MSG,MPI_COMM_WORLD);
          if(Error != MPI_SUCCESS) break;
      }
      

    3. 节点1…N-1执行基于IDW的估计


      for(int i=0;i<=data_size-nodes_in_play;i+=nodes_in_play) { Error = MPI_Recv(test_point,3,MPI_DOUBLE,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status); if(status.MPI_TAG == END_MSG) break; ... IDW2 code Error = MPI_Send(&zdiff,1,MPI_DOUBLE,NNodes-1,PIPE_MSG,MPI_COMM_WORLD); }

    4. 节点N接收并序列化到输出文件

    这对3个节点很好,但是对于更多的节点,IDW循环由于复杂的循环边界而被一些节点关闭,并且整个运行被阻塞。什么是运行接收的简单方法。。处理。。在中间节点中发送任务。我在找一条漂亮的环线。

    我所做的:

    根据我更好的判断,我在中间节点中添加了一个while(1)循环,如果接收到带有END_标记的消息,则使用退出条件。一旦所有点都被发送出去,Node0就向所有中间节点发送结束标记消息。

    1 回复  |  直到 12 年前
        1
  •  0
  •   whatnick    15 年前

    while循环是一个难看的解决方案,但可以使用结束标志。我会坚持到现在。