gpt4 book ai didi

c++ - MPI_Bcast 中的段错误

转载 作者:太空狗 更新时间:2023-10-29 23:02:13 24 4
gpt4 key购买 nike

我是 Open MPI 的新手,我正在尝试使用它来运行一个使用字典攻击的强力密码破解器(我实际上并不是在破解密码,这只是一个练习)。我使用的字典是 vector<char>其中单词由空终止符分隔。

使用 MPI_Barriers , 我确定错误发生在第二个 MPI_Bcast (广播 MPI_Bcastdictionary )。我已验证缓冲区的内容( vector 的大小)已成功广播。

我收到的错误是代码为“地址未映射”的段错误 (11)。

出于某种原因,当使用 > 2 个进程运行时,这总是发生在排名 2 的进程中。如果我只运行 2 个进程,它会出现在排名 1 的进程中。我不知道它是否总是由于偶然、由于调度而陷入 2 级进程,或者它是否实际上只是 2 级进程中的一个问题(我发现它最不可能发生在 2 个进程中) .

在其他类似的问题中,问题在于buffer是如何传递的。正常问题是用户在 c 程序中手动分配内存,将指针的地址而不是指针本身传递给数组。这不是这里的问题(我什至出于绝望尝试过,但它被捕获为编译器错误)。

我现在不知道问题出在哪里。它可能与传递缓冲区有关,或者完全与其他东西有关。如果需要更多代码,请告诉我。

相关代码:

void BroadCast_Receive(vector<char> &dictionary, vector<char> &passwords){

int buffer[2];

buffer[0] = dictionary.size();
buffer[1] = passwords.size();

MPI_Bcast(buffer,2,MPI_INT,0,MPI_COMM_WORLD);

dictionary.resize(buffer[0]);
passwords.resize(buffer[1]);

// seg faults here
MPI_Bcast(&dictionary[0],buffer[0],MPI_INT,0,MPI_COMM_WORLD);

MPI_Bcast(&passwords[0],buffer[1],MPI_INT,0,MPI_COMM_WORLD);
}

最佳答案

您的问题是您的 MPI_Datatype 不匹配。您正在使用 MPI_INT,而您的 dictionarypasswordsstd::vector 类型的 char 。请改用 MPI_CHAR

此外,正如 PaulMcKenzie 所指出的,如果 vector 的大小为 0&dictionary[0] 仍然会失败。对于干净的代码,您应该检查此条件或断言它。

以下代码应该适合您:

void BroadCast_Receive(vector<char> &dictionary, vector<char> &passwords){

int buffer[2];

buffer[0] = dictionary.size();
buffer[1] = passwords.size();

MPI_Bcast(buffer,2,MPI_INT,0,MPI_COMM_WORLD);

if (buffer[0] > 0) {
dictionary.resize(buffer[0]);
MPI_Bcast(&dictionary[0],buffer[0],MPI_CHAR,0,MPI_COMM_WORLD);
}

if (buffer[1] > 0) {
passwords.resize(buffer[1]);
MPI_Bcast(&passwords[0],buffer[1],MPI_CHAR,0,MPI_COMM_WORLD);
}
}

关于c++ - MPI_Bcast 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29324516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com