【问题标题】:Compile Eigen + Intel MKL with CMake使用 CMake 编译 Eigen + Intel MKL
【发布时间】:2017-11-23 08:21:25
【问题描述】:

我想将英特尔 MKL 库(包括 Pardiso 求解器)与 Eigen3 一起使用。当我在 CMake 中手动指定编译器选项时,我让它工作(为此我遵循了Intel Link Line Advisor)。但我知道有一种通过FindBLAS.cmakeBLA_VENDOR 环境变量的预定义方式,特别是使用由Eigen 修改的FindBLAS.cmake。只有我坚持这一点。我应该如何写我的CMakeLists.txt

我应该强调在集群上使用最新的 Eigen3 版本,因此已将其“安装”在我的主文件夹中一个重要的位置。同样在简单使用后

cmake /path/to/eigen3 -DCMAKE_INSTALL_PREFIX:PATH=$HOME/opt
make install

我没有得到第三方 CMake 文件。


编辑

我找到了一个似乎可以正常工作的解决方案:

cmake_minimum_required(VERSION 2.8.12)

project(main)

set(PROJECT_LIBS "")

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# find Eigen3, use an environment variable that specifies the root of the Eigen download:
#   export EIGENPATH="/path/to/clone/of/eigen3/"
list(APPEND CMAKE_MODULE_PATH "$ENV{EIGENPATH}/cmake/")
find_package(Eigen3 3.3.0)
include_directories(${EIGEN3_INCLUDE_DIRS})

# enable Intel-MKL (only for Intel compilers)
# NB requires correct specification of BLA_VENDOR, e.g.
#   export BLA_VENDOR=Intel10_64lp_seq
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
  find_package(BLAS)
  include_directories(${BLAS_INCLUDE_DIRS})
  set(PROJECT_LIBS ${BLAS_LIBRARIES})
  add_definitions(-DEIGEN_USE_MKL_ALL)
endif()

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBS})

请注意,重要的是要注意 Eigen 的“安装”不适用于此解决方案,因为 pkg-config 上的 piggy-bagging 在这里是不够的。 IE。应该只下载/克隆 Eigen 并将 CMake 指向下载位置。

【问题讨论】:

  • 那么,当您尝试简单地使用find_package(NAME) 时它不起作用?哪些变量没有准确设置?缺少哪些编译器标志?
  • @Ptaq666 我添加了到目前为止我尝试过的所有内容(除了我自己的FindMKL.cmake 版本,它与本次讨论无关)。
  • 尝试从 CMake 打印所有包含目录。下面是一些示例:stackoverflow.com/questions/6902149/…。似乎某些findXXX.cmake 脚本没有设置所有适当的包含目录。解决它的一种残酷方法是添加target_include_directories(appropriate_target PUBLIC DIR_WITH_mkl.h)
  • @Ptaq666 感谢您为我指明正确的方向。我已将我的解决方案发布为我的问题的编辑。如果您发现改进,请发表评论(或更改)。

标签: c++ cmake intel-mkl eigen3


【解决方案1】:

回答这个问题可能有点晚了,但是对于最近的 CMake 版本,您可以使用以下内容。这可能是一个更清洁的解决方案。

cmake_minimum_required(VERSION 2.8.3)

project(main)

set(CMAKE_CXX_STANDARD 14)

find_package(Eigen3 REQUIRED)
include_directories(
    ${EIGEN3_INCLUDE_DIRS}
)

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
    set(BLA_VENDOR Intel10_64lp)
    add_definitions(-DEIGEN_USE_MKL_ALL)
endif()

find_pacakge(BLAS REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} Eigen3::Eigen ${BLAS_LIBRARIES})

确保您已运行 oneAPI/MKL 设置 vars 脚本。

source /opt/intel/oneapi/setvars.sh for oneAPI(最好将其添加到.bashrc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2023-03-13
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多