Eclipse 上的 Fortran Openmp 大数组;程序崩溃

Fortran Openmp large array on Eclipse; Program Crash

我正在使用带有 GNU Fortran 编译器的 Eclipse 来计算大型数组以解决矩阵问题。但是,我已经阅读并注意到我无法将所有数据读入数组,这导致我的 project.exe 在我将 -fopenmp 调用到我的编译器设置时崩溃;否则,程序运行正常。

program Top_tier

integer, parameter:: n=145894, nz_num=4608168

integer ia(n+1), ja(nz_num)
double precision a(nz_num), rhs(n)

integer i

open (21, file='ia.dat')
do i=1, n+1
    read(21,*) ia(i)
enddo
close(21)

open (21, file='a.dat')
do i=1, nz_num
    read(21,*) a(i)
enddo
close(21)

open (21, file='ja.dat')
do i=1, nz_num
    read(21,*) ja(i)
enddo
close(21)

open (21, file='b.dat')
    do i=1, n
read(21,*) rhs(i)
enddo
close(21)

End

在寻找解决方案的过程中,我发现最可能的原因是堆栈大小的限制,如果我将 nz_num 设置为小于或等于26561,程序将 运行 正常。一种可能的解决方案是设置环境变量以增加堆栈大小,但当我在程序中键入 "setenv" 或 "export" OMP_STACKSIZE 时程序无法识别。难道我做错了什么?关于如何解决这个问题有什么建议吗?

谢谢!

您正在堆栈上分配 arhsia ja,这就是您 运行 出堆栈的原因 space 首先。我建议总是在堆上分配大数组:

integer, parameter:: n=145894, nz_num=4608168

integer, dimension(:), allocatable :: ia, ja
double precision, dimension(:), allocatable ::  a, rhs

integer i

allocate(ia(n+1), ja(nz_num))
allocate(a(nz_num), rhs(n))

! rest of your code...

deallocate(ia, ja)
deallocate(a, rhs)

您不是直接声明您的四个特定大小的数组(导致它们在堆栈上分配),而是将它们声明为可分配并给出数组的形状。再往下,您可以将数组分配到您想要的大小。这个大小可以在运行时选择。这意味着,如果您从文件中读取数组,您还可以将数组的大小存储在文件的开头并将其用于分配调用。 最后,与动态分配的内存一样,不要忘记在不再需要它们时释放它们。

编辑: 我忘了说这与 openmp 没有任何关系,除了 openmp 线程可能有非常小的堆栈大小限制(在这种情况下它只是 openmp 主线程)。