我对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)
子句来计算您的总和,而不是声明在这种情况下无效且可避免的白话区域。
我希望这对您有所帮助。