看起来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没变。 所以我真的不知道如何解决这个问题。 矩阵是目标,因为如果我正在搜索最大或更小的特征值,我会使用指向一个或另一个的指针,我还尝试使函数末尾的指针无效,但它没有任何区别,请帮忙