非常に大きなファイルを調べて特定のものを検索する 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構文コードを正しく投稿していません。私が理解に欠けていると思うのは、次のとおりです。
send
とrecv
呼び出しの数が一致する必要がありますが、(*) break ステートメントはsend
もう一度呼び出されrecv
ますか?MPI_Irecv
データが受信されるのを常に監視しているわけではありませんか?
Runningmpiexec -n 12
は、5 回の実行ごとに 1 回か 2 回、"someone said us" を出力します。
私の質問は次のとおりです。他のプロセスが計算したときにデータを送信するアプローチは何ですか(受信はブロックされるべきではなく、送信はブロックされる可能性があります)?
ubuntu 13.04でopenmpi-1.6実装を使用しています