回 帖 发 新 帖 刷新版面

主题:经典错误解决不了:openmp中segmentation fault

程序串行时没有错误,一加上openmp并行后就运行不了,报错是
/var/spool/torque/mom_priv/jobs/6127.node1.SC: line 11:   629 Segmentation fault
上网查了一下这个错误的原因,然后做了以下这些

1.在工作目录下找到.bashrc文件,加入语句export STACKSIZE=500M
2.在提交任务的脚本中加入语句 export STACSIZE=500M
3.在SSH页面上运行ulimit -s 500000
4.在openmp并行区,把比较大的数组都改成了动态数组

不过都没用,还是同样的错误,不知道该怎么办了,上来请教高手们
谢谢!!!

(用的是gfortran编译器,曙光集群)



回复列表 (共23个回复)

21 楼

董老师,-W1, stack=xxxxxxxx查了一下手册,没查到是什么意思;加入-fno-automatic之后重新编译还是报同样的错误。

并行区的代码如下:(Gv1就是我说的那个比较大的,需要开到800*800的数组)

  length=1d-2
  !$OMP parallel num_threads(8) default(shared) private(zero,M,Gv1)
     Gv1=(0d0,0d0)   
     !$OMP do
       do U=1,500
          zero=length*U-length/2
          do M=1,N
            call integral(zero,M,Gv1)
          enddo
        enddo
      !$OMP end do
      !$OMP critical
        Gv=Gv+Gv1
      !$OMP end critical
    !$OMP end parallel

当然程序不止这些,子程序主程序什么的加一起至少3000行,但只有主程序用了并行,这段就是主程序的核心并行区,适当做了些删减方便阅读。

22 楼

你用董兄的gcc(MINGW版)编译一下在WIN系统里看看能执行否?

23 楼

如果integral(zero,M,Gv1)这个是算积分的话,那么看M的大小和积分步长
设置不好,很容易堆栈溢出。

我写的是-Wl,而不是-W1
这个的意思是把后面的内容传递给ld,所以一定要在链接期间加入。

我来回复

您尚未登录,请登录后再回复。点此登录或注册