【发布时间】: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。我仍然有错误