3

非常に大きなファイルを調べて特定のものを検索する C プログラムがあります。次のように機能します。

  • 塗りつぶしサイズを見つけるfseek(file_descriptor, 0, SEEK_END)
  • プロセス数で分割
  • 各プロセスは、その境界間で二分探索を実行します

今私がやりたいのは、あるプロセスが探していたものを見つけたときです(基本的には、ftell(file_descriptor)それを他のすべてのプロセスに送信するためのオフセット.

私のアプローチは次のようなものでした:

MPI_Irecv(&buffer..., MPI_ANY_SOURCE,... &request);
while (condition) {
    MPI_Test(&request, &test, &status);
    if (test == 1) {
        // break since data is in buffer ?
        printf("someone told us");
        break;
    }
    //code
    if (condition_for_found) {
        offset = ftell(file_descriptor);
        for (i = 0; i < numprocs; ++i) {
            MPI_Send(&offset, ...i, ...);
        }
        break; // (*)
    }
}

アプローチの問題だと思うので、C構文コードを正しく投稿していません。私が理解に欠けていると思うのは、次のとおりです。

  • sendrecv呼び出しの数が一致する必要がありますが、(*) break ステートメントはsendもう一度呼び出されrecvますか?
  • MPI_Irecvデータが受信されるのを常に監視しているわけではありませんか?

Runningmpiexec -n 12は、5 回の実行ごとに 1 回か 2 回、"someone said us" を出力します。

私の質問は次のとおりです。他のプロセスが計算したときにデータを送信するアプローチは何ですか(受信はブロックされるべきではなく、送信はブロックされる可能性があります)?

ubuntu 13.04でopenmpi-1.6実装を使用しています

4

0 に答える 0