基本的に、まばらにサンプリングされたポイントのセットでのIDW2ベースのグリッド化のためのMPI実装があります。私は次のように仕事を分割しました:
- すべてのノードがすべてのデータを読み取ります。最後のノードは読み取る必要はありませんが、何でも読み取ります。
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メッセージを送信します。