mkl blas 例程 sytrf 在 fortran 模块内部时给出多次调用的分段错误

问题描述 投票:0回答:0

看起来mkl真的疯了,我根本无法确定问题的本质。

我正在使用 mkl 例程在 fortran 中实现我自己的 Lanczos 对角化算法以对其进行优化。问题是它的行为就像它正在使用大量内存,而显示器显示 6GB 的可用内存。

我正在尝试调用该函数三次:

program main
    implicit none
    real(8)::A(100,100),d1(4),d2(4),d3(4)
    integer(8) :: i

    forall (i=1:100) A(i,i)=real(i,8)

    call lanczos(A,20,d1)
    call lanczos(A,20,d2)
    call lanczos(A,20,d3)

end program 

其中 lanczos(A,k,d) 使用维度 k 的 Krylov 子空间计算 size(d) 最小特征值。 第一次调用总是有效,但在第二次或第三次调用时失败。它不会发生在较小的 krylov 子空间维度上,即使错误来自上三角和下三角中 A 的因式分解,这与 k!如果我使用它也不会出错

call lanczos(A,20,**d2**)
在上次调用中,它检测到我没有使用 d3,所以它不占用空间,但它只有 4 个大小,不可能产生差异

在函数 lanczos 中有两个具有可分配属性的数组,但它们在函数结束时被释放。 使用sytrf的部分是:

N=size(A,1)
allocate(invA(N,N),ipiv(N))
invA=A
call sytrf(invA,ipiv=ipiv)

地点:

real(8),intent(in),target :: A(:,:)        
real(8),allocatable,target :: invA(:,:)
integer(8),allocatable :: ipiv(:)

我也开始觉得invA=A可能不是深拷贝,所以我尝试修改invA的一个值,但是A没变。 所以我真的不知道如何解决这个问题。 矩阵是目标,因为如果我正在搜索最大或更小的特征值,我会使用指向一个或另一个的指针,我还尝试使函数末尾的指针无效,但它没有任何区别,请帮忙

segmentation-fault fortran lapack
© www.soinside.com 2019 - 2024. All rights reserved.