使用MKL构建Arpack-ng时出现整数参数异常问题求助
Arpack-ng + MKL调用dsaupd函数的整数参数异常问题
问题现象
开发同时调用Arpack-ng与MKL的程序时,测试dsaupd函数调用,预期返回ido=-1、info=0,但实际返回ido=99、info=4294967286(即2^32-10)。
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,疑似主程序中info被当作无符号整数处理(尽管声明为带符号整数)。 info=-10与数组索引偏移有关:- 主程序的
iparam(1)对应dsaupd内部的iparam(1) - 主程序的
iparam(2)对应dsaupd内部的iparam(3) - 主程序的
iparam(3)对应dsaupd内部的iparam(5) - 以此类推,整数数组
iparam和ipntr存在索引偏移问题,实数数组(如resid)无此异常。
- 主程序的
解决方案
- 强制整数宽度匹配:在编译命令中添加
-i4选项,强制使用32位整数,避免编译器默认整数宽度与Arpack-ng构建时的INTERFACE64=0(32位整数)不匹配。 - 使用Arpack模块接口:替换
external :: dsaupd为use arpack(需确保Arpack-ng构建时启用了模块生成),模块会自动保证参数类型、维度的一致性,避免手动声明external导致的参数传递错误。 - 关闭ICB选项重新构建Arpack-ng:构建时添加
-DICB=OFF参数关闭Internal Callback机制,排查是否为回调逻辑导致的参数偏移问题。 - 初始化所有数组元素:在主程序中初始化
iparam和ipntr的所有元素为0,再赋值需要的位置,避免未初始化的内存干扰参数传递。 - 关闭优化测试:编译时改用
-O0选项关闭优化,排除编译器优化导致的参数传递异常。
内容的提问来源于stack exchange,提问作者VINCENZO BISOGNO
相关产品推荐
相关产品推荐

