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

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

下面是我最近遇到的问题的最小工作示例:

我的源代码:

// 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 的 this post,并且在包含 Eigen 之前尝试添加

#define EIGEN_DEFAULT_DENSE_INDEX_TYPE long long int
。但我仍然遇到同样的错误。

c++ cmake eigen intel-mkl pardiso
1个回答
0
投票

仔细阅读cmake配置过程的输出后,我意识到可以通过将

MKL_INTERFACE
设置为
lp64
来解决问题,如
MKLConfig.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>)
© www.soinside.com 2019 - 2024. All rights reserved.