MPI Send 给出分段错误

Posted

技术标签:

【中文标题】MPI Send 给出分段错误【英文标题】:MPI Send is giving segmentation fault 【发布时间】:2017-11-10 23:43:54 【问题描述】:

我正在尝试使用 MPI(boost) 运行遗传算法,其中我必须将序列化对象从等级 0 发送到所有其他等级。但是当我尝试发送数据时,我收到了分段错误的错误。

这是我得到的代码、输出和错误。

代码:问题出在 world.send(0, 0, newP);

int main (int argc, char** argv) 

    Population *pop = NULL;
    RuckSack r(true);
    int size, rank;
    Ga ga;
    namespace mpi = boost::mpi;
    mpi::environment env;
    mpi::communicator world;

    int countGeneration = 0;

    /* code */

    if (world.rank() == 0)
    

        if (pop == NULL)
        

            pop = new Population(60,true);
        

    

    for (int m = 0; m < 20; m++)
    
        /* code */

        for (int i = 0; i< world.size(); i++)
        
            world.send(i,0,pop);
        


        world.recv(0, 0, pop);
        Population newP = *pop;


        newP = ga.evolvePopulation(newP, world.size());




        world.send(0, 0, newP);

    MPI_Finalize();

    return (EXIT_SUCCESS);

错误:

mpirun noticed that process rank 0 with PID 10336 on node user exited on signal 11 (Segmentation fault).

输出:

[user:10336] *** Process received signal ***
[user:10336] Signal: Segmentation fault (11)
[user:10336] Signal code: Address not mapped (1)
[user:10336] Failing at address: 0x31
[user:10336] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x35860)[0x7f1e93064860]
[user:10336] [ 1] /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.61.0(+0x14a24)[0x7f1e9409da24]
[user:10336] [ 2] /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.61.0(+0x15d11)[0x7f1e9409ed11]
[user:10336] [ 3] ./teste(+0x1de7c)[0x55ab4c07ae7c]
[user:10336] [ 4] ./teste(+0x1dd2c)[0x55ab4c07ad2c]
[user:10336] [ 5] ./teste(+0x1db3a)[0x55ab4c07ab3a]
[user:10336] [ 6] ./teste(+0x1d8eb)[0x55ab4c07a8eb]
[user:10336] [ 7] ./teste(+0x1d2da)[0x55ab4c07a2da]
[user:10336] [ 8] ./teste(+0x1cb20)[0x55ab4c079b20]
[user:10336] [ 9] ./teste(+0x1bed0)[0x55ab4c078ed0]
[user:10336] [10] ./teste(+0x1b47c)[0x55ab4c07847c]
[user:10336] [11] ./teste(+0x19741)[0x55ab4c076741]
[user:10336] [12] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7f1e9304f3f1]
[user:10336] [13] ./teste(+0x112aa)[0x55ab4c06e2aa]
[user:10336] *** End of error message ***

【问题讨论】:

我假设您的逻辑允许您尝试发送空弹出指针。只有在“world.rank() == 0”时才分配 Population 对象,所以很可能是 world.rank() != 0。如果是这样,请告诉我,我会给出答案。 我建议您考虑有用答案的反馈,并使用正确的minimal reproducible example 重新发布问题(请仔细阅读该页面!)。同时记录您自己的调试尝试。 【参考方案1】:

以下是一些疯狂的猜测:

    您应该只对 rank0 进程执行初始发送指令 - 现在您执行所有没有意义的进程(并且可能是问题的原因) 您不应该发送给“自己”。在你循环的第一次迭代中,rank0 向自己发送一个发送,这 afaik 将阻止等待接收的进程。但是由于 rank0 被阻止,它永远不会到达“recv”行并且将永远保持锁定状态。除此之外,进程向自身发送数据也没有任何意义。

这些只是松散的建议,因为我在使用 MPI 方面的经验有限。希望对您有所帮助!

【讨论】:

这些都是非常好的观点——你不应该像胡乱猜测那样轻描淡写。但是,这些都不能解释段错误。 你说得对,我修复了最初的发送指令——确实,我的错误:/。它没有解决问题,但对我帮助很大。谢谢你:)

以上是关于MPI Send 给出分段错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 MPI_Bcast 时出现 MPI 分段错误

分段错误:C++ 中的结构序列化和 MPI 数据传输

MPI calloc 导致分段错误

为啥 MPI_Barrier 在 C++ 中会导致分段错误

打开 MPI Waitall() 分段错误

MPI 分段故障(信号 11)