我有一个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循环由于棘手的循环边界而被一些节点关闭并且整个运行被卡住。什么是一个简单的方法运行receive .. process ..在中间节点发送任务。我正在寻找一个漂亮的for循环线。
我做了什么:
根据我的判断,我在中间节点中添加了while(1)循环,如果收到END_TAG消息,则退出条件。一旦所有点都被发送出去,Node0就会向所有中间节点发送END_TAG消息。
答案 0 :(得分:0)
while循环是一个丑陋的解决方案,但使用End标志。我现在会坚持下去。