Tom de Geus
Tom de Geus

Reputation: 5965

Compile Eigen + Intel MKL with CMake

I want to use the Intel MKL libraries (including the Pardiso solver) with Eigen3. When I manually specify the compiler options in CMake I get it to work (for that I've followed the Intel Link Line Advisor). But I know there is a pre-difined way through FindBLAS.cmake together with the BLA_VENDOR environment variable, in particular using the FindBLAS.cmake modified by Eigen. Only I'm stuck with this. How should I write my CMakeLists.txt?

I should emphesize that use the latests Eigen3 version on a cluster, so have 'installed' it in a non-trivial location in my home-folder. Also after simply using

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

I did not get the third-party CMake files.


Edit

I have found a solution that seems to work properly:

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})

Note that it is important to remark that the 'installation' of Eigen does not work for this solution, as piggy-bagging on pkg-config is not sufficient here. I.e. one should just download/clone Eigen and point CMake to the download location.

Upvotes: 2

Views: 2860

Answers (1)

Atharva Dubey
Atharva Dubey

Reputation: 915

It might be a tad bit late to answer this, but with the recent CMake Versions, you could use the following. This might be a cleaner solution.

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})

Make sure you have run the oneAPI/MKL setup vars script.

source /opt/intel/oneapi/setvars.sh for oneAPI(it is probably best to add it to .bashrc)

Upvotes: 2

Related Questions