我正在制作一个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个密码对其进行排序)。
所有进程首次收到正确的密码,当他们获取第二个密码时,只有1个进程具有正确的密码,其余进程接收“/”字符。
答案 0 :(得分:0)
好吧,典型的情况是我开始工作并且看起来很简单。 我会留下这个问题,以防万一其他人碰巧遇到同样的问题。
我在探测之后忘记了也收到了解决方案。 从来没有完全清楚探测器与接收器的不同之处,但我猜探测器只是标记了一些变化,但实际上它要从“队列”中取出,然后你需要接收它。