2011-10-31 14 views
1

私はプログラム0を実行しようとしていますが、プロセス0はメッセージを自身以外のランダムプロセスに送信する初期化を開始する必要があります。別のランダムプロセスに送信します。これは、送信される要求された数のメッセージが完了するまで行われなければなりません。これは、ユーザーが入力として指定します。私ひどく終了したプロセスの一つ**私のプログラムは、最大2か、他にもなしでメッセージを送信し、私に次のエラーループ内のメッセージのMPI連続送信と受信

を与えているのいずれかのことを参照してください。終端(信号15:EXITのSTRINGで終了 アプリケーションをクリーンアップここでは)

**

は私のコードで、レムは、その中にいただきました!ループホールを知っています。ランダム生成部分は含まれておらず、正常に動作しています。

if(rank==0) 
{ 
rnum=rgenerator(rank,size); 
string++; 
MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD); 
printf("\n process %d sends message to process %d",rank, rnum); 

//MPI_Recv(&flag, 100, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 

} 

    while(flag!=1) 
    { 

    if(MPI_Recv(&string, 50, MPI_INT, MPI_ANY_SOURCE, rank, MPI_COMM_WORLD, &status)==MPI_SUCCESS) 
    { 

     printf("\n process %d receives message from process %d count : %d",rank, status.MPI_SOURCE, string); 
     rnum=rgenerator(rank,size); 
     printf("\n Random num generated is %d",rnum); 
     string=string+1; 
     MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD); 
     count++; 

     printf("\n process %d sends message to process %d", rank, rnum); 

     //MPI_Bcast(&count, 40, MPI_INT, rank, MPI_COMM_WORLD); 
     if(string==n) 
     { 
      printf("\n\n Messages reached"); 
      flag=1; 

     } 

    } 
    else 
     flag=0; 
    } 

答えて

1

送信と受信の操作が同じであることを確認してください。あなたのコードでは、あなたはrecv操作以上に1つの送信操作を稼ぐことができます。したがって、1つのプロセスがクラッシュします。

//MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD); 
    count++; 

    printf("\n process %d sends message to process %d", rank, rnum); 

    //MPI_Bcast(&count, 40, MPI_INT, rank, MPI_COMM_WORLD); 
    if(string==n) 
    { 
     printf("\n\n Messages reached"); 
     flag=1; 

    } 
    if(flag!=1){//make sure that you need to send one message. 
     MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD); 
    } 
:あなたはフラグが1に等しくない場合にのみ送信する必要があり、これを回避するために

関連する問題