MPI開発に関連するプロジェクトで問題が発生しています。私はいくつかの解析ルールに基づいて入力文字列の解析を開始し、マスターノードとのテーブル(異なる状態と関連するアクションを含む)を解析するMPIを使用したRNA解析アルゴリズムの実装に取り組んでいます。構文解析テーブルでは、各状態に対して複数のアクションが並行して実行できます。ですから、これらのアクションをさまざまなプロセスに分散する必要があります。これを行うために、私は現在の状態と解析情報(現在の解析のスタック)を別のスレッドを使用してノードに送信して、メインスレッドが受信したアクションに基づいて解析中にビジー状態の間に他のノードからアクションを受け取ります。続いて、送信側と受信側のコードスニペットです:MPI - MPI_Recvでのメッセージの切り捨て
送信者コード:
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、count = 19、MPI_CHAR、src = 3、tag = 1、MPI_COMM_WORLD、status = 0x0)が失敗しました MPIDI_CH3U_Request_unpack_uebuf(625)Lメッセージが切り捨てられました。 21のバイトが受信したが、バッファサイズは、ジョブ内の0 73 hpc081_56549 19 ランクは、すべての集団アボートがランク0の終了ステータスをランク付けに起因する:信号9
によって殺された私は、ノンブロッキングMPI呼び出しが、まだ使用してこれをもを試してみました同様のエラー。
エラーは、 'MPI_Recv'が予想以上のデータを受信していることを示します(19ではなく21文字)。受信者コードを実行する複数のスレッドがありますか?そうであれば、別のスレッド用のデータを受け取るスレッドがあり、それゆえに異なる 'e_count'があります。 –