与Lapack和OpenMP链接时出现分段错误

时间:2016-06-03 17:53:50

标签: segmentation-fault fortran gfortran lapack

当我链接以下代码时

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会消除错误。这是什么原因?

1 个答案:

答案 0 :(得分:1)

这是因为-fopenmp暗示-frecursive(尝试改为一个)。这将导致数组被放置在堆栈上,并且您将获得堆栈溢出。默认情况下,数组是静态的。

Tho编译器在内部执行此操作(-fdump-tree-original):

MAIN__ ()
{
  complex(kind=8) a[262144];
  complex(kind=8) b[262144];
  complex(kind=8) c[262144];

你可能会认为没有必要影响主程序数组,因为主程序不是可重入的,但-frecursive可以做到这一点。如果您制作阵列allocatable,他们将不会受到影响。