簡體   English   中英

C-MPI子進程收到不正確的字符串

[英]C - MPI child processes receiving incorrect string

我正在制作一個MPI密碼破解程序,它使用蠻力破解SHA512哈希鍵,我的代碼可以很好地使用1個密碼和多個進程,或多個密碼和1個進程,但是當我使用多個密碼和多個進程時,我得到以下錯誤:

[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

當它只應發送一次,或者至少要發送兩次時,這些值之一應該是2,不是兩個都為1嗎?

我的代碼主要如下:進程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); 

子進程破解密碼,然后重復下一個。 (假設有一個,目前是一個無限循環,但在解決該問題之前,我想用2個密碼進行排序)。

所有進程都首次獲得正確的密碼,這是當它們獲取第二個密碼時,只有一個進程具有正確的密碼,其余進程收到一個“ /”字符。

好吧,典型的案例是我變得精疲力盡,看上去有些簡單。 我將保留這個問題,以防萬一其他人碰巧遇到相同的問題。

我忘記了在探究之后也收到了解決方案。 永遠不會完全清楚探針與接收有何不同,但是我想探針只是標記某些更改,但實際上要將其從“隊列”中取出,然后需要通過接收來收集它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM