2013-10-16 98 views
1

MHM,你好,大家都是在运行并行程序在室内用Linux的MPI和OpenMP的时候得到这些错误,MPI_Comm_size分段故障

[node65:03788] *** Process received signal *** 
[node65:03788] Signal: Segmentation fault (11) 
[node65:03788] Signal code: Address not mapped (1) 
[node65:03788] Failing at address: 0x44000098 
[node65:03788] [ 0] /lib64/libpthread.so.0 [0x2b663e446c00] 
[node65:03788] [ 1] /public/share/mpi/openmpi- 1.4.5//lib/libmpi.so.0(MPI_Comm_size+0x60) [0x2b663d694360] 
[node65:03788] [ 2] fdtd_3D_xyzPML_MPI_OpenMP(main+0xaa) [0x42479a] 
[node65:03788] [ 3] /lib64/libc.so.6(__libc_start_main+0xf4) [0x2b663e56f184] 
[node65:03788] [ 4] fdtd_3D_xyzPML_MPI_OpenMP(_ZNSt8ios_base4InitD1Ev+0x39) [0x405d79] 
[node65:03788] *** End of error message *** 
----------------------------------------------------------------------------- 
mpirun noticed that process rank 2 with PID 3787 on node node65 exited on signal 11 (Segmentation fault). 
----------------------------------------------------------------------------- 

后,我分析的核心文件,我得到以下信息:

[Thread debugging using libthread_db enabled] 
[New Thread 47310344057648 (LWP 26962)] 
[New Thread 1075841344 (LWP 26966)] 
[New Thread 1077942592 (LWP 26967)] 

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 47310344057648 (LWP 26962)] 
0x00002b074afb3360 in PMPI_Comm_size() from /public/share/mpi/openmpi-1.4.5//lib/libmpi.so.0 

这是什么原因造成的?感谢您的帮助

代码(TEST.CPP)如下,你可以试试:

#include <stdio.h> 
#include <stdlib.h> 
#include <omp.h> 
#include "mpi.h" 

int main(int argc, char* argv[]) 
{ 
int nprocs = 1; //the number of processes 
int myrank = 0; 
int provide; 

MPI_Init_thread(&argc,&argv,MPI_THREAD_FUNNELED,&provide); 
if (MPI_THREAD_FUNNELED != provide) 
{ 
    printf ("%d != required %d", MPI_THREAD_FUNNELED, provide); 
    return 0; 
} 

MPI_Comm_size(MPI_COMM_WORLD,&nprocs); 
MPI_Comm_rank(MPI_COMM_WORLD,&myrank); 

int num_threads = 1;  //Openmp 
omp_set_dynamic(1); 
num_threads = 16; 
omp_set_num_threads(num_threads); 

#pragma omp parallel 
{ 
    printf ("%d omp thread from %d mpi process\n", omp_get_thread_num(), myrank); 

} 
MPI_Finalize(); 

} 
+0

你能告诉我们导致段错误的代码吗?您可能需要使用调试enablead编译您的程序,并在像mpirun -np 2 xterm -e gdb -ex run parallel_program'这样的调试器中运行它。 –

+0

感谢您的帮助,我不知道哪个代码会导致这种情况,我认为它与MPI_Comm_size有关。对于源代码太长而无法向您显示,我感到抱歉。另外,代码可以在Windows中运行。在将run_environment更改为Linux之后,我使用makefile来编译我的代码,并且在运行“mpirun -np 8 parallel_program”时没有任何错误,它具有上述错误。 – kenan

+0

向我们展示'main'函数的相关部分,包括初始化MPI的方式以及如何调用'MPI_Comm_size'。 –

回答

1

嗯,这可能不是很多,甚至有点跛脚的答案,但是在混合使用不同的MPI安装(精确的OpenMPI和MVAPICH2)时,我遇到了这个问题。

这里有一些事情要检查

  • 对你的链接是什么版本的MPI的
ldd <application> | grep -i mpi 
    libmpi.so.1 => /usr/lib64/mpi/gcc/openmpi/lib64/libmpi.so.1 (0x00007f90c03cc000) 
  • 是动态加载的是什么版本的MPI的
echo $LD_LIBRARY_PATH | tr : "\n" | grep -i mpi 
/usr/lib64/mpi/gcc/openmpi/lib64 
  • 你是否覆盖此动态加载(这个变量应该是空的,除非你知道自己在做什么)
echo $LD_PRELOAD 

如果这一切OK,你需要检查你链接到的每个库都依赖于MPI,并且链接到相同的版本。如果没有其他库链接到MPI,则不应出现任何内容。

ldd <application> | sed "s/^\s*\(.*=> \)\?//;s/ (0x[0-9a-fA-F]*)$//" | xargs -L 1 ldd | grep -i mpi 

如果一些可疑的事不露面,说libmpich.so.3 => /usr/lib64/mpi/gcc/MVAPICH2/1.8.1/lib/libmpich.so.3例如,您应该删除-L 1和的东西代替grep的可视化(没有?或者less,或vim - ...),然后搜索对于那条嫌疑线。