繁体   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