在Armadillo中用Intel MKL求逆矩阵触发DGETRF参数错误求助
问题:Armadillo调用Intel MKL求逆时报错
Intel oneMKL ERROR: Parameter 1 was incorrect on entry to DGETRF 代码实现
#define ARMA_DONT_USE_WRAPPER #define ARMA_USE_BLAS #define ARMA_USE_LAPACK arma::mat A = { { 0.0013 , 0.1741 , 0.9885 , 0.1662 , 0.8760 } , { 0.1933 , 0.7105 , 0.1191 , 0.4508 , 0.9559 } , { 0.5850 , 0.3040 , 0.0089 , 0.0571 , 0.5393 } , { 0.3503 , 0.0914 , 0.5317 , 0.7833 , 0.4621 } , { 0.8228 , 0.1473 , 0.6018 , 0.5199 , 0.8622 } }; A.print("A: "); arma::mat B = arma::inv(A); B.print("inv(A): "); arma::mat I = A*B; I.print("I: ");
CMake检测到的MKL配置信息
[cmake] -- MKL_VERSION: 2024.2.0 [cmake] -- MKL_ROOT: C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2 [cmake] -- MKL_ARCH: None, set to ` intel64` by default [cmake] -- MKL_LINK: None, set to ` dynamic` by default [cmake] -- MKL_INTERFACE_FULL: None, set to ` intel_ilp64` by default [cmake] -- MKL_THREADING: None, set to ` intel_thread` by default [cmake] -- MKL_MPI: None, set to ` intelmpi` by default [cmake] -- Found C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/lib/mkl_scalapack_ilp64_dll.lib [cmake] -- Found DLL: C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/bin/mkl_scalapack_ilp64.2.dll [cmake] -- Found C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/lib/mkl_cdft_core_dll.lib [cmake] -- Found DLL: C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/bin/mkl_cdft_core.2.dll [cmake] -- Found C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/lib/mkl_intel_ilp64_dll.lib [cmake] -- Found C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/lib/mkl_intel_thread_dll.lib [cmake] -- Found DLL: C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/bin/mkl_intel_thread.2.dll [cmake] -- Found C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/lib/mkl_core_dll.lib [cmake] -- Found DLL: C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/bin/mkl_core.2.dll [cmake] -- Found C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/lib/mkl_blacs_ilp64_dll.lib [cmake] -- Found DLL: C:/Program Files (x86)/Intel/oneAPI/mkl/2024.2/bin/mkl_blacs_ilp64.2.dll [cmake] -- Found C:/Program Files (x86)/Intel/oneAPI/compiler/latest/lib/libiomp5md.lib [cmake] -- Imported oneMKL targets: MKL::mkl_scalapack_ilp64;MKL::mkl_cdft_core;MKL::mkl_intel_ilp64;MKL::mkl_intel_thread;MKL::mkl_core;MKL::mkl_blacs_ilp64;MKL::MKL
报错信息
Intel oneMKL ERROR: Parameter 1 was incorrect on entry to DGETRF.
Armadillo相关配置宏说明
- ARMA_DONT_USE_WRAPPER:调用LAPACK、BLAS等函数时绕过Armadillo运行时包装库,需直接链接BLAS、LAPACK等库
- ARMA_USE_LAPACK:启用LAPACK或其高速替代库(如OpenBLAS、Intel MKL),Armadillo的
inv()等函数依赖LAPACK - ARMA_DONT_USE_LAPACK:禁用LAPACK,优先级高于ARMA_USE_LAPACK
开发环境
- Qt Creator IDE 14
- MSVC 2022(64位)
- Qt 6.8
- Armadillo 14.0.3
- Intel OneAPI MKL 2024.2
问题原因及解决步骤
核心原因
报错根源是整数接口不匹配:Armadillo默认使用LP64接口(32位整数),而CMake自动配置的MKL使用了ILP64接口(64位整数),导致传递给MKL的LAPACK函数(如DGETRF)参数类型不兼容,触发参数错误。
解决方法(二选一即可)
方法1:修改MKL为LP64接口
在CMakeLists.txt中显式设置MKL的接口类型为LP64,匹配Armadillo默认配置:
set(MKL_INTERFACE_FULL "intel_lp64" CACHE STRING "MKL interface type")
重新运行CMake配置,确保MKL链接的是mkl_intel_lp64_dll.lib而非ILP64版本。
方法2:修改Armadillo为64位整数接口
在代码中添加ARMA_64BIT_WORD宏定义,让Armadillo使用64位整数,匹配MKL的ILP64接口:
#define ARMA_64BIT_WORD // 必须放在其他Armadillo宏之前 #define ARMA_DONT_USE_WRAPPER #define ARMA_USE_BLAS #define ARMA_USE_LAPACK
同时保持CMake中MKL的MKL_INTERFACE_FULL为intel_ilp64配置。
额外注意事项
- 所有Armadillo相关宏定义必须在包含Armadillo头文件之前设置,否则不生效。
- 确保项目正确链接MKL,CMake中直接链接
MKL::MKL目标即可自动处理所有依赖。
内容的提问来源于stack exchange,提问作者Dock
相关产品推荐
相关产品推荐

