2017-03-21 8 views
0

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 „/“.

Antwort

0

In Ordnung, typischer Fall von mir aufgearbeitet zu werden und mit Blick auf etwas einfach. Ich lasse diese Frage für den Fall, dass jemand anderes das gleiche Problem hat.

Ich war zu vergessen, auch die Lösung zu erhalten, nachdem es Sondieren. war nie ganz klar, wie Sonde empfangen unterschied, aber ich denke Sonde nur Fahnen etwas ändert, aber es nehmen tatsächlich aus der „Warteschlange“ müssen Sie dann sammeln sie erhalten mit.

+0

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