2011-12-19 8 views
2

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呼び出しが、まだ使用してこれをもを試してみました同様のエラー。

+3

エラーは、 'MPI_Recv'が予想以上のデータを受信して​​いることを示します(19ではなく21文字)。受信者コードを実行する複数のスレッドがありますか?そうであれば、別のスレッド用のデータを受け取るスレッドがあり、それゆえに異なる 'e_count'があります。 –

答えて

0

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

  1. 送信者は、要素数とゼロ長のメッセージ(MPI_Send(&snd_stack.contents...ライン)を送信します。
  2. 受信者がループから壊れているため、この2番目のメッセージに一致する受信はありません。
  3. 長さゼロのメッセージは、他のものと一致して、回線を見ているエラーが発生する可能性があります。
関連する問題