c++ - MPI_Bcast 中的段错误

标签 c++ mpi

我是 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/

相关文章:

algorithm - 数独与 MPI 并行化

c++ - 使用 C++ 创建权力表

C++ .cpp 文件看不到 .h 中的变量

macos - 如何在 Homebrew 软件上构建带有 mpi 支持的 boost?

c - MPI_Reduce 和 MPI_MIN 如何工作?

multithreading - 在MPI_Recv变量之前连续多次使用MPI_Send变量

c - 在集群节点上显式分布 MPI 进程

c++ - 如何找到对象是由哪些类型组成的?

c++ - 在 GTK 中保存/恢复窗口位置

c++ - 绘制带渐变的圆有问题