使用 Eigen 编译 PardisoSupport 时遇到问题?

Trouble compiling PardisoSupport with Eigen?

提问人:Hans 提问时间:11/13/2023 更新时间:11/13/2023 访问量:34

问:

以下是我最近遇到的问题的最低工作示例:

我的源代码:

// main.cc
#define EIGEN_USE_MKL_ALL
#include <Eigen/Sparse>
#include <Eigen/PardisoSupport>

int main() {
    Eigen::SparseMatrix<double> sp;
    Eigen::PardisoLDLT<Eigen::SparseMatrix<double>> ldlt_solver;
    ldlt_solver.compute(sp);

}

而 cmake 文件直接来自官网

# CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(test)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

find_package(Eigen3 3.4.0 REQUIRED)
find_package(MKL CONFIG REQUIRED)

add_executable(main main.cc)
target_link_libraries(main PUBLIC Eigen3::Eigen)
target_compile_options(main PUBLIC $<TARGET_PROPERTY:MKL::MKL,INTERFACE_COMPILE_OPTIONS>)
target_include_directories(main PUBLIC $<TARGET_PROPERTY:MKL::MKL,INTERFACE_INCLUDE_DIRECTORIES>)
target_link_libraries(main PUBLIC $<LINK_ONLY:MKL::MKL>)

我使用以下代码进行编译:

mkdir build
cd build
cmake ..
make

然后我收到以下编译错误:

/usr/include/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h:50:22: error: cannot convert ‘int*’ to ‘const long long int*’
   50 |       ::pardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
      |                      ^~~~~~
      |                      |
      |                      int*

我从 Eigen 的官方网站上注意到了这一点:

  1. 在 64 位系统上,必须使用 LP64 接口(而不是 ILP64 接口)

并认为这可能是导致编译错误的问题。但是,我不知道这会导致什么。我是否需要更改链接或编译选项才能使其正常工作?

我也读过这篇关于stackoverflow的文章,我尝试在包括Eigen之前添加。但我仍然遇到同样的错误。#define EIGEN_DEFAULT_DENSE_INDEX_TYPE long long int

C++ CMake eigen intel-mkl pardiso

评论


答:

0赞 Hans 11/13/2023 #1

在仔细阅读了 cmake 配置过程的输出后,我意识到可以通过设置为以下方式来解决该问题:MKL_INTERFACElp64MKLConfig.cmake

这是最后的:CMakeLists.txt

# CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(test)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# for 64 bit system
set(MKL_INTERFACE lp64)
find_package(MKL CONFIG REQUIRED)
find_package(Eigen3 3.4.0 REQUIRED)

add_executable(main main.cc)
target_link_libraries(main PUBLIC Eigen3::Eigen)
target_compile_options(main PUBLIC $<TARGET_PROPERTY:MKL::MKL,INTERFACE_COMPILE_OPTIONS>)
target_include_directories(main PUBLIC $<TARGET_PROPERTY:MKL::MKL,INTERFACE_INCLUDE_DIRECTORIES>)
target_link_libraries(main PUBLIC $<LINK_ONLY:MKL::MKL>)