为什么我在 Openmp 中添加存储在数组中的数字时出现分段错误



我对Openmp很陌生。我正在汇总存储在数组中的 N 个整数并使用 gfortran 编译代码。在N=10^6之前,从串行码和并行码获得的结果完全相同。对于 N=10^7,串行代码正在运行,但并行代码(使用 -fopenmp 标志编译后(给出"分段错误"。我在这里给出了我的代码。谁能帮我为什么会这样?

  use omp_lib
  REAL*8 r,summ,sl
  parameter (N=10000000)
  dimension r(N)
  do i=1,N
  r(i)=i
  enddo
  summ=0.0d00
  sl=0.0d00
  !$OMP PARALLEL FIRSTPRIVATE(sl) SHARED(r,summ)
  !$OMP DO 
  do i=1,N
  sl=sl+r(i)
  enddo
  !$OMP END DO
  !$OMP CRITICAL
  summ=summ+sl
  !$OMP END CRITICAL
  !$OMP END PARALLEL
  write(*,*)'SUM',summ
  end

我以前遇到过同样的问题。问题是您的代码似乎需要大量内存。

请确保在编译代码-mcmodel=medium时使用编译器选项。 此外,当您使用 -fopenmp 编译器会系统地调用-frecursive将堆栈的大小限制为默认值。因此,您的代码会尝试在堆栈限制之外进行操作,从而导致分段错误。要解决此问题,您必须取消堆栈的默认限制。快速执行此操作的一种方法是在终端上运行命令ulimit -s unlimited,然后在同一终端中启动代码。您还可以使用具有良好值 n 的编译选项 -fmax-stack-var-size=n 来设置堆栈的大小,使其适合您的数据。

另外,我建议使用reduction (+:sum)子句来计算您的总和,而不是声明在这种情况下无效且可避免的白话区域。

我希望这对您有所帮助。

最新更新