Ich mache ein MPI Passwort-Cracker, die Brute-Force-Ansatz verwendet einen SHA512 Hash-Schlüssel zu knacken, ich Code, der mit 1 Passwort und mehrere Prozesse oder mehrere Passwörter und 1 Prozess funktioniert gut , aber wenn ich mehrere Passwörter & mehrere Prozesse bekomme ich folgende Fehlermeldung:C - MPI Kindprozesse falsche Zeichenfolge empfangen
[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)
ich glaube, das durch den Prozess Rang # 1 empfängt eine Zeichenfolge „/“ anstelle des Passwort-Hash verursacht wird. Das Problem ist, ich bin mir nicht sicher warum.
ich auch seltsam etwas mit meinem Code bemerkt hat, ich die folgende Schleife in dem Prozess Rang habe 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]);
}
}
}
}
, die für eine der untergeordneten Prozesse Looping warten hält es aufmerksam zu machen, dass sie das Passwort gefunden haben . Können sagen, ich 2 Prozesse leite (mit Ausnahme des Basisprozesses) und Prozess 2 findet das Passwort, wird die Ausgabe dann:
sending done to process 1
sending done to process 1
Wenn es nur, dass einmal werden soll, senden, oder zumindest, wenn es sendet es zweimal sicher der eine dieser Werte sollte 2 sein, nicht beide von ihnen 1 sein?
Der Hauptteil meiner Code ist wie folgt: Prozess 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]);
}
}
}
}
}
, die durch die Datei-Loops, schnappt sich ein neues Kennwort ein, um die Zeichenfolge zu den untergeordneten Prozessen sendet, an welcher Stelle sie es erhalten :
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);
Die Child-Prozesse knacken das Passwort, dann wiederholen Sie mit dem nächsten. (Angenommen, es gibt eine, derzeit ist es eine Endlosschleife, aber ich möchte es mit 2 Passwörter aussortieren, bevor ich das behebe).
Alle Prozesse empfangen das richtige Passwort zum ersten Mal, es ist, wenn sie das zweite Passwort greifen, die nur 1 Prozess die richtigen und den Rest hat erhält ein Zeichen „/“.
Um zu klären, Sondieren können Sie die Länge der eingehenden Nachricht zu extrahieren, so dass Puffer richtig zugeordnet werden erhalten könnten. 'MPI_Irecv' benötigt dagegen eine bestimmte Nachrichtenlänge. Weitere Informationen hierzu finden Sie unter http://mpitutorial.com/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/. – Shibli