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

Posted

技术标签:

【中文标题】为啥 MPI_Barrier 在 C++ 中会导致分段错误【英文标题】:Why does MPI_Barrier cause a segmentation fault in C++为什么 MPI_Barrier 在 C++ 中会导致分段错误 【发布时间】:2016-10-31 08:40:17 【问题描述】:

我已将我的程序简化为以下示例:

#include <mpi.h>

int main(int argc, char * argv[]) 
    int rank, size;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
    return 0;

我编译运行代码,得到如下结果:

My-MacBook-Pro-2:xCode_TrapSim user$ mpicxx -g -O0 -Wall barrierTest.cpp -o barrierTestExec
My-MacBook-Pro-2:xCode_TrapSim user$ mpiexec -n 2 ./barrierTestExec

==================================================================================    =
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 21633 RUNNING AT My-MacBook-Pro-2.local
=   EXIT CODE: 11
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault: 11 (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions

如果我注释掉 MPI_Barrier,或者只在一个节点上运行程序,代码运行良好。我正在使用以下编译器:

My-MacBook-Pro-2:xCode_TrapSim user$ mpiexec --version
HYDRA build details:
Version:                                 3.2
Release Date:                            Wed Nov 11 22:06:48 CST 2015
CC:                              clang    
CXX:                             clang++    
F77:                             /usr/local/bin/gfortran   
F90:                             /usr/local/bin/gfortran   
Configure options:                       '--disable-option-checking' '--prefix=/usr/local/Cellar/mpich/3.2_1' '--disable-dependency-tracking' '--disable-silent-rules' '--mandir=/usr/local/Cellar/mpich/3.2_1/share/man' 'CC=clang' 'CXX=clang++' 'FC=/usr/local/bin/gfortran' 'F77=/usr/local/bin/gfortran' '--cache-file=/dev/null' '--srcdir=.' 'CFLAGS= -O2' 'LDFLAGS=' 'LIBS=-lpthread ' 'CPPFLAGS= -I/private/tmp/mpich-20160606-48824-1qsaqn8/mpich-3.2/src/mpl/include -I/private/tmp/mpich-20160606-48824-1qsaqn8/mpich-3.2/src/mpl/include -I/private/tmp/mpich-20160606-48824-1qsaqn8/mpich-3.2/src/openpa/src -I/private/tmp/mpich-20160606-48824-1qsaqn8/mpich-3.2/src/openpa/src -D_REENTRANT -I/private/tmp/mpich-20160606-48824-1qsaqn8/mpich-3.2/src/mpi/romio/include'
Process Manager:                         pmi
Launchers available:                     ssh rsh fork slurm ll lsf sge manual persist
Topology libraries available:            hwloc
Resource management kernels available:   user slurm ll lsf sge pbs cobalt
Checkpointing libraries available:       
Demux engines available:                 poll select


My-MacBook-Pro-2:xCode_TrapSim user$ clang --version
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.5.0
Thread model: posix
InstalledDir:     /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

这似乎应该是一个微不足道的问题,但我似乎无法弄清楚。为什么 MPI_Barrier 会导致这个简单的代码出现段错误?

【问题讨论】:

我无法复制。您的代码在此处运行而不会崩溃。 我并不感到惊讶,它是 MPI 的一个几乎微不足道的例子,但无论我拥有什么编译器组合或其他东西都不能合作。我只是希望有人以前看过这个。 欢迎来到 SO。虽然您的问题问得很好,但仍然难以重现,因此了解您的问题。可能的答案是您的 MPI 安装有问题,但这并没有太大帮助。您能否添加一些有关如何安装 MPI 的详细信息?最终向包提供者报告错误(假设它来自存储库)可能更有希望。 【参考方案1】:

很难确定您的安装出了什么问题。但是,如果您可以使用任何一种 MPI 风格,也许您可​​以试试这个:

http://www.owsiak.org/?p=3492

我只能说,它适用于 Open MPI

~/opt/usr/local/bin/mpicxx -g -O0 -Wall barrierTestExec.cpp -o barrierTestExec
~/opt/usr/local/bin/mpiexec -n 2 ./barrierTestExec

在我的情况下也不例外。它似乎确实是特定于环境的。

【讨论】:

以上是关于为啥 MPI_Barrier 在 C++ 中会导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章

测试 MPI_Barrier C++

为啥在 Objective-C 中执行 alloc 和 init 在单独的语句中会导致对象根据 Xcode 静态分析器被释放?

MPI 屏障 C++

为啥在可重复读取中会发生写入偏斜?

MPI_Barrier 在循环中不起作用

MPI_Barrier - 只有一些进程通过屏障