与 Lapack 和 OpenMP 链接时出现分段错误
Segmentation fault when linking with Lapack and OpenMP
当我link下面的代码
PROGRAM MAIN
implicit none
integer(8), PARAMETER :: N=2**9
complex(8) ::A(N,N),B(N,N),C(N,N)
C=matmul(A,B)
end program MAIN
使用 Lapack 和 OpenMP 通过:
gfortran test.f95 -O3 -Wall -g -std=f95 -cpp -I /usr/include/ -L
/usr/lib -lm -fopenmp -lpthread -lblas -llapack
-fexternal-blas
我遇到了分段错误。将数组的维数减少到 2**8 或删除 OpenMP 可消除错误。这是什么原因?
这是因为 -fopenmp
意味着 -frecursive
(请改用那个)。这将导致数组被放置在堆栈上,你会得到一个堆栈溢出。默认情况下,数组将是静态的。
编译器在内部执行此操作 (-fdump-tree-original
):
MAIN__ ()
{
complex(kind=8) a[262144];
complex(kind=8) b[262144];
complex(kind=8) c[262144];
您可能会争辩说没有必要影响主程序数组,因为主程序不可重入,但 -frecursive
会这样做。如果你制作数组 allocatable
它们不会受到影响。
当我link下面的代码
PROGRAM MAIN
implicit none
integer(8), PARAMETER :: N=2**9
complex(8) ::A(N,N),B(N,N),C(N,N)
C=matmul(A,B)
end program MAIN
使用 Lapack 和 OpenMP 通过:
gfortran test.f95 -O3 -Wall -g -std=f95 -cpp -I /usr/include/ -L /usr/lib -lm -fopenmp -lpthread -lblas -llapack -fexternal-blas
我遇到了分段错误。将数组的维数减少到 2**8 或删除 OpenMP 可消除错误。这是什么原因?
这是因为 -fopenmp
意味着 -frecursive
(请改用那个)。这将导致数组被放置在堆栈上,你会得到一个堆栈溢出。默认情况下,数组将是静态的。
编译器在内部执行此操作 (-fdump-tree-original
):
MAIN__ ()
{
complex(kind=8) a[262144];
complex(kind=8) b[262144];
complex(kind=8) c[262144];
您可能会争辩说没有必要影响主程序数组,因为主程序不可重入,但 -frecursive
会这样做。如果你制作数组 allocatable
它们不会受到影响。