使用 mkl 构建 Arpack-ng 时整数错误

Error in integers when building Arpack-ng with mkl

提问人:VINCENZO BISOGNO 提问时间:8/28/2023 更新时间:8/31/2023 访问量:26

问:

我正在尝试编写一个同时使用 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 变量是一个无符号的 int,即使它没有被声明为这样。此外,info=-10 与数组索引已移动的事实有关:

  • main/iparam(1) -> dsaupd/iparam(1)
  • main/iparam(2) -> dsaupd/iparam(3)
  • main/iparam(3) -> dsaupd/iparam(5) 等等。

这样的问题只发生在整数数组(iparam 和 ipntr)上,而对于实数数组(我尝试过 resid)则不会发生。

我不知道是Arpack-ng的构建选项还是编译选项有问题,更糟糕的是,是包问题。

整数溢出 intel-mkl arpack

评论


答:

0赞 VINCENZO BISOGNO 8/28/2023 #1

发生的情况是,主程序使用 8 个字节的整数,而例程使用 4 个字节。我没有意识到这是错误,因为我已经尝试使用接口构建,但我没有意识到 cmake 总是链接而不是 .缺少的是以下行:ArpackArpackILP64libmkl_intel_lp64libmkl_intel_ilp64

cmake -D BLA_VENDOR=Intel10_64ilp