我有一个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循环由于复杂的循环边界而被一些节点关闭,并且整个运行被阻塞。什么是运行接收的简单方法。。处理。。在中间节点中发送任务。我在找一条漂亮的环线。
我所做的:
根据我更好的判断,我在中间节点中添加了一个while(1)循环,如果接收到带有END_标记的消息,则使用退出条件。一旦所有点都被发送出去,Node0就向所有中间节点发送结束标记消息。