【问题标题】:Segmentation fault with MPI_Comm_RankMPI_Comm_Rank 的分段错误
【发布时间】:2020-07-21 14:15:22
【问题描述】:

我必须编写几年前使用 MPI 和 PETSc 编写的代码。 当我尝试运行它时,函数 MPI_Comm_rank() 出现错误。 这是代码的开头:

int main(int argc,char **argv)
{
    double mesure_tps2,mesure_tps1;
    struct timeval tv;
    time_t curtime2,curtime1;
    
    char help[] = "Solves linear system with KSP.\n\n";  // NB: Petsc est defini dans "fafemo_Constant_Globales.h"


    std::cout<< "d�but PetscInitialize" <<std::endl;
    (void*) PetscInitialize(&argc,&argv,(char *)0,help);
    std::cout<< "d�but PetscInitialize fait" <<std::endl;

    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    PetscFinalize();

}

显然,在 MPI_Comm_rank() 和 PetscFinalize() 之间有一些代码。 PetscInitialize 和 PetscFinalize 分别调用 MPI_INIT 和 MPI_FINALIZE。

在我的 makefil 我有:

PETSC_DIR=/home/thib/Documents/bibliotheques/petsc-3.13.2
PETSC_ARCH=arch-linux-c-debug
include ${PETSC_DIR}/lib/petsc/conf/variables
include ${PETSC_DIR}/lib/petsc/conf/rules

PETSC36 = -I/home/thib/Documents/bibliotheques/petsc-3.13.2/include -I/home/thib/Documents/bibliotheques/petsc-3.13.2/arch-linux-c-debug/include

Mpi_include=-I/usr/lib/x86_64-linux-gnu/openmpi

#a variable with some files names
fafemo_files = fafemo_CI_CL-def.cc fafemo_Flux.cc fafemo_initialisation_probleme.cc fafemo_FEM_setup.cc fafemo_sorties.cc fafemo_richards_solve.cc element_read_split.cpp point_read_split.cpp read_split_mesh.cpp


PETSC_KSP_LIB_VSOIL=-L/home/thib/Documents/bibliotheques/petsc-3.13.2/  -lpetsc_real -lmpi -lmpi++

fafemo:    ${fafemo_files} fafemo_Richards_Main.o
    g++ ${CXXFLAGS} -g -o fafemo_CD ${fafemo_files} fafemo_Richards_Main.cc ${PETSC_KSP_LIB_VSOIL} $(PETSC36) ${Mpi_include}

使用 g++ 或 mpic++ 似乎没有任何改变。

它可以编译,但是当我尝试执行时,我有:

[thib-X540UP:03696] Signal: Segmentation fault (11)
[thib-X540UP:03696] Signal code: Address not mapped (1)
[thib-X540UP:03696] Failing at address: 0x44000098
[thib-X540UP:03696] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x3efd0)[0x7fbfa87e4fd0]
[thib-X540UP:03696] [ 1] /usr/lib/x86_64-linux-gnu/libmpi.so.20(MPI_Comm_rank+0x42)[0x7fbfa9533c42]
[thib-X540UP:03696] [ 2] ./fafemo_CD(+0x230c8)[0x561caa6920c8]
[thib-X540UP:03696] [ 3] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7fbfa87c7b97]
[thib-X540UP:03696] [ 4] ./fafemo_CD(+0x346a)[0x561caa67246a]
[thib-X540UP:03696] *** End of error message ***
--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 0 on node thib-X540UP exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------

另外,我的电脑上还有其他 MPI 程序,我从来没有遇到过这样的问题。 有谁知道我为什么会得到这个?

【问题讨论】:

  • 您可能正在混合使用 Open MPI 包含文件(在您的 Makefile 中)和 petsc 使用的基于 mpich 的库。尝试在您的 petsc 库上运行 ldd 以仔细检查内部使用了哪个 MPI 实现。
  • 好的,我明白了。但我不明白“尝试在您的 petsc 库上运行 ldd”。抱歉,我对 petsc 很陌生,必须使用代码来使用它。此外,我尝试提供 petsc 文件夹中文件 mpi.h 的路径,以确保 #include "mpi.h" 已使用该文件完成。还是不行
  • 如果您注释掉MPI_Comm_rank() 调用,您的代码还会崩溃吗?
  • @GillesGouaillardet 它稍后会崩溃,因为需要变量 world_rank
  • 我还更改了 PetscInitialize() 和 PetscFinalize() 以使用 MPI_INIT() 和 MPI_FINALIZE。我仍然有错误

标签: c++ makefile mpi


【解决方案1】:

如果有人有同样的问题: 当我安装 PETSc 时,我使用 --download-mpich 运行 ./configure,而我的计算机上已经安装了 mpi。 为了解决这个问题,我执行了“rm -rf ${PETSC_ARCH}”并再次运行 ./configure。

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2014-06-23
    相关资源
    最近更新 更多