使用MPI进行循环处理(关闭一个/一些)

时间:2010-10-06 06:43:11

标签: loops parallel-processing mpi mpich

我有一个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确实接收并序列化为输出文件

  5. 这适用于3个节点但由于节点越多,IDW循环由于棘手的循环边界而被一些节点关闭并且整个运行被卡住。什么是一个简单的方法运行receive .. process ..在中间节点发送任务。我正在寻找一个漂亮的for循环线。

    我做了什么:

    根据我的判断,我在中间节点中添加了while(1)循环,如果收到END_TAG消息,则退出条件。一旦所有点都被发送出去,Node0就会向所有中间节点发送END_TAG消息。

1 个答案:

答案 0 :(得分:0)

while循环是一个丑陋的解决方案,但使用End标志。我现在会坚持下去。