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