MPI - MPI_Recvにおけるメッセージの切り捨て

私はMPI開発に関連するプロジェクトで問題を抱えています。私はいくつかの解析ルールに基づいて入力文字列の解析を開始し、マスターノードとのテーブル(異なる状態と関連するアクションを含む)を解析するMPIを使用したRNA解析アルゴリズムの実装に取り​​組んでいます。構文解析テーブルでは、各状態に対して複数のアクションが並行して実行できます。ですから、これらのアクションをさまざまなプロセスに分散する必要があります。これを行うために、私は現在の状態と解析情報(現在の解析のスタック)を別のスレッドを使用してノードに送信して、メインスレッドが受信したアクションに基づいて解析中にビジー状態の間に他のノードからアクションを受け取ります。送信者と受信者のコードスニペットは次のとおりです。

送信者コード:

StackFlush(&snd_stack);
StackPush(&snd_stack, state_index);
StackPush(&snd_stack, current_ch);
StackPush(&snd_stack, actions_to_skip);
elements_in_stack = stack.top + 1;
for(int a=elements_in_stack-1;a>=0;a--)
                StackPush(&snd_stack, stack.contents[a]);
StackPush(&snd_stack, elements_in_stack);
elements_in_stack = parse_tree.top + 1;
for(int a=elements_in_stack-1;a>=0;a--)
                StackPush(&snd_stack, parse_tree.contents[a]);
StackPush(&snd_stack, elements_in_stack);
elements_in_stack = snd_stack.top+1;
MPI_Send(&elements_in_stack, 1, MPI_INT, (myrank + actions_to_skip) % mysize, MSG_ACTION_STACK_COUNT, MPI_COMM_WORLD);
MPI_Send(&snd_stack.contents[0], elements_in_stack, MPI_CHAR, (myrank + actions_to_skip) % mysize, MSG_ACTION_STACK, MPI_COMM_WORLD);

レシーバコード:

MPI_Recv(&e_count, 1, MPI_INT, MPI_ANY_SOURCE, MSG_ACTION_STACK_COUNT, MPI_COMM_WORLD, &status);
if(e_count == 0){
                break;
}
while((bt_stack.top + e_count) >= bt_stack.maxSize - 1){usleep(500);}
pthread_mutex_lock(&mutex_bt_stack); //using mutex for accessing shared data among threads
MPI_Recv(&bt_stack.contents[bt_stack.top + 1], e_count, MPI_CHAR, status.MPI_SOURCE, MSG_ACTION_STACK, MPI_COMM_WORLD, &status);
bt_stack.top += e_count;
pthread_mutex_unlock(&mutex_bt_stack);

このプログラムは、通信量の少ない小さな入力に対してはうまく動作していますが、入力サイズを大きくすると、応答が通信を増加させるため、受信者は処理中に多くの要求を受け取りますが、

MPI_Recvの致命的なエラー:メッセージが切り捨てられ、エラースタック: MPI_Recv(186)..........................................:MPI_Recv(buf = 0x5b8d7b1、カウント= 19、MPI_CHAR、src = 3、tag = 1、MPI_COMM_WORLD、status = 0x41732100)失敗 MPIDI_CH3U_Request_unpack_uebuf(625)Lメッセージが切り捨てられました。受信された21バイトがバッファサイズが19である ジョブ73のランク0 hpc081_56549はランク0のすべてのランクの終了ステータスを一括して打ち切りました:シグナル9によって殺されました。

私は非ブロッキングMPI呼び出しを使用してこれを試しましたが、同様のエラーは依然としてあります。

2
このエラーは、 MPI_Recv が予想より多くのデータを受信して​​いることを示します(19ではなく21文字)。受信者コードを実行する複数のスレッドがありますか?そうであれば、別のスレッド用のデータを受け取っているスレッドがある可能性があります。したがって、異なる e_count です。
追加された 著者 Shawn Chin,

1 答え

私はコードの残りの部分がどのように見えるかは分かりませんが、ここには考えがあります。 break があるので、私は受信機コードがループ文またはswitch文の一部であると仮定しています。その場合、要素数が0になると、送受信間に不一致があります。

  1. The sender will send the element count and a zero-length message (the MPI_Send(&snd_stack.contents... line).
  2. There will be no matching receive for this second message because the receiver breaks out of the loop.
  3. The zero-length message will then match something else, possibly causing the error you are seeing down the line.
0
追加された