【发布时间】:2026-01-21 19:45:01
【问题描述】:
我是 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
【问题讨论】:
-
请看链接,错误是一样的,必须使用
shared,而不是firstprivate。实际上,您应该完全删除sl并使用summ进行缩减。 -
但是Segfault的真正原因在这里*.com/questions/13264274/…我建议使用可分配数组,但你也可以使用无限堆栈。
-
我认为
firstprivate和shared没有任何问题。累加是通过初始化为零的线程局部变量完成的,然后每个线程将其私有累加器原子地求和到(共享)全局累加器中。这与其他问题(未共享全局累加器)不同。
标签: parallel-processing fortran openmp gfortran