我有一个 MPI 实现,基本上用于在一组稀疏采样点上进行基于 IDW2 的网格化。我将工作划分如下:
- 所有节点都读取所有数据,最后一个节点不需要,但无论如何。
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; }
节点 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); }节点 N 确实接收并序列化到输出文件
这适用于 3 个节点,但对于更多节点,IDW 循环会由于棘手的循环边界而关闭,并且整体运行会卡住。在中间节点中运行接收..进程..发送任务的简单方法是什么。我正在寻找一个漂亮的 for 循环线。
我做了什么:
根据我的更好判断,我在中间节点中添加了一个 while(1) 循环,如果收到带有 END_TAG 的消息,则带有退出条件。一旦所有的点都被发送出去,Node0 就会向所有的中间节点发送一条 END_TAG 消息。