1

我有一个 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 循环会由于棘手的循环边界而关闭,并且整体运行会卡住。在中间节点中运行接收..进程..发送任务的简单方法是什么。我正在寻找一个漂亮的 for 循环线。

我做了什么:

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

4

1 回答 1

0

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

于 2010-10-10T17:02:58.007 回答