如何在Armadillo中使用intel MKL来反转非奇异矩阵?

问题描述 投票:0回答:1

犰狳代码:

    #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 错误:进入 DGETRF 时参数 1 不正确。

犰狳可以通过编辑文件 include/armadillo_bits/config.hpp:

进行配置
  • ARMA_DONT_USE_WRAPPER -> 在调用 LAPACK、BLAS、ARPACK 和 SuperLU 函数时禁用运行时犰狳包装库 (libarmadillo.so)。您需要直接链接 BLAS、LAPACK 等(例如 -lblas -llapack)

  • ARMA_USE_LAPACK -> 启用 LAPACK 或 LAPACK 的高速替代品(例如 OpenBLAS、Intel MKL 或 Accelerate 框架)。 Armadillo 需要 LAPACK 来执行 svd()、inv()、eig_sym()、solve() 等函数。

  • 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

c++ armadillo qt6 intel-mkl
1个回答
0
投票

OneAPI MKL 可以配置为使用 64 位整数。 标准 BLAS 和 LAPACK 使用 32 位整数。

在包含 Armadillo 标头之前启用

ARMA_BLAS_LONG_LONG
选项,以在调用 BLAS 和 LAPACK 函数时强制使用 64 位整数。 这可以像这样完成:

#define ARMA_DONT_USE_WRAPPER
#define ARMA_BLAS_LONG_LONG
#include <armadillo>
© www.soinside.com 2019 - 2024. All rights reserved.