我正在尝试调试Fortran MPI程序。当我尝试使用5个进程运行它时,我遇到了分段错误。奇怪的是,如果我使用较少的进程运行相同的程序,则不会发生这种情况。
当使用Valgrind(Memcheck)运行程序并使用GDB分析生成的核心文件(其中有3个)时,我得到以下输出:
Core was generated by `'.
Program terminated with signal 11, Segmentation fault.
#0 0x000000000692a186 in poll () from /lib64/libc.so.6
(gdb) bt
#0 0x000000000692a186 in poll () from /lib64/libc.so.6
#1 0x000000000c47763b in btl_openib_async_thread () from /usr/mpi/intel/openmpi-1.4.3/lib/openmpi/mca_btl_openib.so
#2 0x000000000664a73d in start_thread () from /lib64/libpthread.so.0
#3 0x0000000006932f6d in clone () from /lib64/libc.so.6
当我在没有Valgrind的情况下运行相同的程序时,核心文件(现在有4个)返回此值(每个核心文件的itistep
值不同):
Core was generated by `/home/me/myprogram.out /home/me/run'.
Program terminated with signal 11, Segmentation fault.
#0 0x00002b04b3fa70f0 in ?? ()
(gdb) bt
#0 0x00002b04b3fa70f0 in ?? ()
#1 <signal handler called>
#2 0x00002b04aea65d4f in opal_memory_ptmalloc2_int_free () from /usr/mpi/intel/openmpi-1.4.3/lib/libopen-pal.so.0
#3 0x00002b04aea6a420 in opal_memory_ptmalloc2_free_hook () from /usr/mpi/intel/openmpi-1.4.3/lib/libopen-pal.so.0
#4 0x00002b04af5477f1 in free () from /lib64/libc.so.6
#5 0x00000000005afecc in for_dealloc_allocatable ()
#6 0x00000000005734a2 in mtd () at mtdk.for:533
#7 0x00000000004ecd76 in opt (itistep=1088970925, inamein=Cannot access memory at address 0x146e0
) at opt.for:494
#8 0x000000000042a074 in cali () at cali.f90:379
#9 0x00000000004183cc in main ()
指向#6(mtdk.for:533
)的行看起来像这样:
if (allocated(done2d))DEALLOCATE (done2D)
在这个程序中,done2d
是一个二维,可分配的real
数组,它被分配在同一个子程序中。我没有看到分配和deallocate
语句之间有任何错误。我将status=
添加到我的deallocate
语句后重新编译了我的程序,因为有人建议here,但我得到了相同的输出。
我正在使用带有以下标志的英特尔Fortran 11.1:-O3 -C -pg -traceback -g -warn interfaces
并在CentOS上运行我的程序。
在命令行中键入ulimit
或ulimit -s
会返回unlimited
。
我不知道接下来要去哪看,有人知道如何利用这些信息找到问题的根源吗?