我正在尝试编写一个将使用 Arpack-ng 和 MKL 例程的程序。我通过运行一个简单的代码来测试行为,该代码使用对函数 dsaupd 的单个调用,该函数应该返回 ido=-1 和 info = 0,但它实际上返回 ido = 99 和 info=4294967286。
这是 Arpack-ng 构建摘要:
-- Configuration summary for arpack-ng-3.9.0:
-- prefix: /usr/local
-- MPI: OFF (ICB provided )
-- ICB: ON
-- INTERFACE64: 0
-- FC: /opt/intel/oneapi/compiler/2023.1.0/linux/bin/intel64/ifort
-- FCFLAGS: -O3
-- CC: /usr/bin/cc
-- CCFLAGS: -O3 -DNDEBUG
-- CXX: /usr/bin/c++
-- CXXFLAGS: -O3 -DNDEBUG
-- BLAS:
-- link: /opt/intel/oneapi/mkl/2023.1.0/lib/intel64/libmkl_intel_lp64.so
-- link: /opt/intel/oneapi/mkl/2023.1.0/lib/intel64/libmkl_intel_thread.so
-- link: /opt/intel/oneapi/mkl/2023.1.0/lib/intel64/libmkl_core.so
-- link: /opt/intel/oneapi/compiler/2023.1.0/linux/compiler/lib/intel64_lin/libiomp5.so
-- link: -lm
-- link: -ldl
-- LAPACK:
-- link: /opt/intel/oneapi/mkl/2023.1.0/lib/intel64/libmkl_intel_lp64.so
-- link: /opt/intel/oneapi/mkl/2023.1.0/lib/intel64/libmkl_intel_thread.so
-- link: /opt/intel/oneapi/mkl/2023.1.0/lib/intel64/libmkl_core.so
-- link: /opt/intel/oneapi/compiler/2023.1.0/linux/compiler/lib/intel64_lin/libiomp5.so
-- link: -lm
-- link: -ldl
-- link: -lm
-- link: -ldl
这是我正在运行的代码:
program dsaupd_mkl
implicit none
integer, parameter :: n=3, ldv=n, ncv = n
integer :: ido, nev, iparam(11), ipntr(11), lworkl, info
real(8) :: tol, resid(n), v(ldv,ncv), workd(3*n), workl(ncv*(ncv+8))
character ::bmat(1)
integer :: ishfts, maxitr, mode1
external :: dsaupd
ido = 0
bmat = 'I'
nev = 1
tol = 0.d0
ishfts = 1
maxitr = 1000
mode1 = 1
!
iparam(1) = ishfts
!
iparam(3) = maxitr
!
iparam(7) = mode1
lworkl = ncv*(ncv+8)
info = 0
print*, 'iparam= ', iparam
print*, ''
call dsaupd( ido, bmat, n, 'SA', nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl,&
lworkl, info )
print*, ido, info
end program dsaupd_mkl
最后是编译行
ifort -I"${MKLROOT}/include" -w _results/$(FILENAME).o -o _results/$(FILENAME) -L${MKLROOT}/lib/intel64 -larpack -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl
通过在 dsaupd.f 中插入一些打印,我发现实际上 info 等于 -10,而返回到主程序的值是 2**32-10,就好像 main 中的 info 变量是一个 unsigned int ,尽管它没有这样声明。此外,info=-10 与数组索引已移动这一事实有关:
此类问题仅发生在整数数组(iparam 和 ipntr)中,而实数数组则不会发生(我尝试使用 resid)。
不知道是不是Arpack-ng的构建选项或者编译选项有问题,更糟糕的是,是包的问题。
发生的情况是主程序使用 8 字节整数,而
Arpack
例程使用 4 字节。我没有意识到这是错误,因为我已经尝试使用 Arpack
接口构建 ILP64
,但我没有意识到 cmake 始终链接 libmkl_intel_lp64
而不是 libmkl_intel_ilp64
。缺少的是以下行:
cmake -D BLA_VENDOR=Intel10_64ilp