2017-03-21 19 views
0

私はSHA512ハッシュキーを解読するために強引なアプローチを使用するMPIパスワードクラッカーを作っています.1つのパスワードと複数のプロセス、または複数のパスワードと1つのプロセス私は複数のパスワード&複数のプロセスを実行するとき、私は次のエラーを取得する:不正な文字列を受け取ったC - MPIの子プロセス

[ubuntu:2341] *** An error occurred in MPI_Recv 
[ubuntu:2341] *** reported by process [191954945,1] 
[ubuntu:2341] *** on communicator MPI_COMM_WORLD 
[ubuntu:2341] *** MPI_ERR_TRUNCATE: message truncated 
[ubuntu:2341] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort, 
[ubuntu:2341] *** and potentially your MPI job) 

私はこれではなく、パスワードのハッシュの文字列「/」を受信プロセスランク1位に起因していると信じています。 問題はなぜわからないのですか?

私も私のコードで奇妙な何かに気づいた、私は、プロセスランク0で次のループを持っている:

子プロセスの一つは、それがパスワードを発見したこと、それを警告するのを待つループを続ける
 while(!done){ 
     MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &done, &status); 
     if(done==1) { 
      for(i=1;i<size;i++){ 
      if(i!=status.MPI_SOURCE){ 
       printf("sending done to process %d\n", i); 
       MPI_Isend(&done, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &request[i]); 
      } 
      } 
     }   
     } 

。私は(基本プロセスを除く)2つのプロセスを実行していると言うことができますし、プロセス2は、パスワードを見つけ、出力は次のようになります。

sending done to process 1 
sending done to process 1 

それは一度だけそれを送信する必要がある、またはそれが送信され、少なくとも場合それらの値の1つは2でなければならず、両方とも1ではないことを2度確かめてください。次のように

私のコードの主要な大部分は次のとおりです。 プロセス0:

ファイルをループ
 while(!feof(f)) { 
     fscanf(f, "%s\n", buffer); 
     int done = 0; 
     int i, sm; 
     // lengths of the word (we know it should be 92 though) 
     length = strlen(buffer); 
     // Send the password to every process except process 0 
     for (sm=1;sm<size;sm++) { 
     MPI_Send(&length, 1, MPI_INT, sm, 0, MPI_COMM_WORLD); 
     MPI_Send(buffer, length+1, MPI_CHAR, sm, 0, MPI_COMM_WORLD); 
     } 
     // While the passwords are busy cracking - Keep probing. 
     while(!done){ 
     MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &done, &status); 
     if(done==1) { 
      for(i=1;i<size;i++){ 
      if(i!=status.MPI_SOURCE){ 
       printf("sending done to process %d\n", i); 
       MPI_Isend(&done, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &request[i]); 
      } 
      } 
     }   
     } 
    } 

は、子プロセスに文字列を送信し、新しいパスワードをグラブ、その時点で彼らはそれを受け取ります:

MPI_Recv(&length, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    printf("string to be recieived has %d characters\n", length); 
    MPI_Recv(buffer, length+1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    printf("Process %d received %s\n", rank, buffer); 

子プロセスはパスワードを解読し、次のプロセスで繰り返します。 (1つがあると仮定すると、現在無限ループですが、私はそれを修正する前に2つのパスワードでそれを並べ替える必要があります)。

すべてのプロセスが最初に正しいパスワードを取得します.2つ目のパスワードを取得したプロセスが1つだけで、残りのプロセスには「/」が付いています。

答えて

0

申し訳ありません。 他の誰かが同じ問題を抱えている場合に備えて、この質問を残しておきます。

プロービング後に解決策を受け取ることも忘れていました。 プローブが受信とどのように異なっているかは決して完全にはっきりしませんでしたが、プローブはちょうど何か変更があると思っていますが、実際にはそれを "キュー"から取り出して受信で収集する必要があります。

+0

プロビジョニングでは、着信メッセージの長さを抽出して、受信バッファを適切に割り当てることができます。一方、 'MPI_Irecv'は、明確なメッセージ長を必要とします。詳細については、[this](http://mpitutorial.com/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/)を参照してください。 – Shibli

関連する問題