271 lines
8.9 KiB
CMake
271 lines
8.9 KiB
CMake
# This file is adapted from the one in OpenMEEG: http://www-sop.inria.fr/athena/software/OpenMEEG/
|
|
# - Try to find the Intel Math Kernel Library
|
|
# Once done this will define
|
|
#
|
|
# MKL_FOUND - system has MKL
|
|
# MKL_ROOT_DIR - path to the MKL base directory
|
|
# MKL_INCLUDE_DIR - the MKL include directory
|
|
# MKL_LIBRARIES - MKL libraries
|
|
#
|
|
# There are few sets of libraries:
|
|
# Array indexes modes:
|
|
# LP - 32 bit indexes of arrays
|
|
# ILP - 64 bit indexes of arrays
|
|
# Threading:
|
|
# SEQUENTIAL - no threading
|
|
# INTEL - Intel threading library
|
|
# GNU - GNU threading library
|
|
# MPI support
|
|
# NOMPI - no MPI support
|
|
# INTEL - Intel MPI library
|
|
# OPEN - Open MPI library
|
|
# SGI - SGI MPT Library
|
|
|
|
# linux
|
|
IF(UNIX AND NOT APPLE)
|
|
IF(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
|
|
SET(MKL_ARCH_DIR "intel64")
|
|
ELSE()
|
|
SET(MKL_ARCH_DIR "32")
|
|
ENDIF()
|
|
ENDIF()
|
|
# macos
|
|
IF(APPLE)
|
|
SET(MKL_ARCH_DIR "intel64")
|
|
ENDIF()
|
|
|
|
IF(FORCE_BUILD_32BITS)
|
|
set(MKL_ARCH_DIR "32")
|
|
ENDIF()
|
|
# windows
|
|
IF(WIN32)
|
|
IF(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
|
|
SET(MKL_ARCH_DIR "intel64")
|
|
ELSE()
|
|
SET(MKL_ARCH_DIR "ia32")
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
SET(MKL_THREAD_VARIANTS SEQUENTIAL GNUTHREAD INTELTHREAD)
|
|
SET(MKL_MODE_VARIANTS ILP LP)
|
|
SET(MKL_MPI_VARIANTS NOMPI INTELMPI OPENMPI SGIMPT)
|
|
|
|
FIND_PATH(MKL_ROOT_DIR
|
|
include/mkl_cblas.h
|
|
PATHS
|
|
$ENV{MKLDIR}
|
|
/opt/intel/mkl/
|
|
/opt/intel/mkl/*/
|
|
/opt/intel/cmkl/
|
|
/opt/intel/cmkl/*/
|
|
/opt/intel/*/mkl/
|
|
/Library/Frameworks/Intel_MKL.framework/Versions/Current/lib/universal
|
|
"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl"
|
|
"C:/Program Files (x86)/Intel/Composer XE 2013/mkl"
|
|
"C:/Program Files/Intel/MKL/*/"
|
|
"C:/Program Files/Intel/ComposerXE-2011/mkl"
|
|
"C:/Program Files/Intel/Composer XE 2013/mkl"
|
|
)
|
|
|
|
FIND_PATH(MKL_INCLUDE_DIR
|
|
mkl_cblas.h
|
|
PATHS
|
|
${MKL_ROOT_DIR}/include
|
|
${INCLUDE_INSTALL_DIR}
|
|
)
|
|
|
|
FIND_PATH(MKL_FFTW_INCLUDE_DIR
|
|
fftw3.h
|
|
PATH_SUFFIXES fftw
|
|
PATHS
|
|
${MKL_ROOT_DIR}/include
|
|
${INCLUDE_INSTALL_DIR}
|
|
NO_DEFAULT_PATH
|
|
)
|
|
|
|
IF(WIN32 AND MKL_ROOT_DIR)
|
|
SET(MKL_LIB_SEARCHPATH $ENV{ICC_LIB_DIR} $ENV{MKL_LIB_DIR} "${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}" "${MKL_ROOT_DIR}/../compiler" "${MKL_ROOT_DIR}/../compiler/lib/${MKL_ARCH_DIR}")
|
|
IF(MKL_INCLUDE_DIR MATCHES "2017" OR MKL_INCLUDE_DIR MATCHES "2018")
|
|
IF(CMAKE_CL_64)
|
|
SET(MKL_LIBS mkl_core mkl_intel_lp64 mkl_lapack95_lp64 mkl_blas95_lp64)
|
|
ELSE()
|
|
SET(MKL_LIBS mkl_core mkl_intel_s mkl_lapack95 mkl_blas95)
|
|
ENDIF()
|
|
IF(TBB_FOUND AND GTSAM_WITH_TBB)
|
|
SET(MKL_LIBS ${MKL_LIBS} mkl_tbb_thread)
|
|
ELSE()
|
|
SET(MKL_LIBS ${MKL_LIBS} mkl_intel_thread libiomp5md)
|
|
ENDIF()
|
|
ELSEIF(MKL_INCLUDE_DIR MATCHES "10.")
|
|
IF(CMAKE_CL_64)
|
|
SET(MKL_LIBS mkl_solver_lp64 mkl_core mkl_intel_lp64 mkl_intel_thread libguide mkl_lapack95_lp64 mkl_blas95_lp64)
|
|
ELSE()
|
|
SET(MKL_LIBS mkl_solver mkl_core mkl_intel_c mkl_intel_s mkl_intel_thread libguide mkl_lapack95 mkl_blas95)
|
|
ENDIF()
|
|
ELSEIF(MKL_INCLUDE_DIR MATCHES "2013") # version 11 ...
|
|
IF(CMAKE_CL_64)
|
|
SET(MKL_LIBS mkl_core mkl_intel_lp64 mkl_intel_thread libiomp5md mkl_lapack95_lp64 mkl_blas95_lp64)
|
|
ELSE()
|
|
SET(MKL_LIBS mkl_core mkl_intel_c mkl_intel_s mkl_intel_thread libiomp5md mkl_lapack95 mkl_blas95)
|
|
ENDIF()
|
|
ELSE() # old MKL 9
|
|
SET(MKL_LIBS mkl_solver mkl_c libguide mkl_lapack mkl_ia32)
|
|
ENDIF()
|
|
|
|
IF (MKL_INCLUDE_DIR MATCHES "10.3")
|
|
SET(MKL_LIBS ${MKL_LIBS} libiomp5md)
|
|
ENDIF()
|
|
|
|
FOREACH (LIB ${MKL_LIBS})
|
|
FIND_LIBRARY(${LIB}_PATH ${LIB} PATHS ${MKL_LIB_SEARCHPATH} ENV LIBRARY_PATH)
|
|
IF(${LIB}_PATH)
|
|
SET(MKL_LIBRARIES ${MKL_LIBRARIES} ${${LIB}_PATH})
|
|
ELSE()
|
|
MESSAGE(STATUS "Could not find ${LIB}: disabling MKL")
|
|
ENDIF()
|
|
ENDFOREACH()
|
|
SET(MKL_FOUND ON)
|
|
ELSEIF(MKL_ROOT_DIR) # UNIX and macOS
|
|
FIND_LIBRARY(MKL_CORE_LIBRARY
|
|
mkl_core
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
|
|
# Threading libraries
|
|
FIND_LIBRARY(MKL_SEQUENTIAL_LIBRARY
|
|
mkl_sequential
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
|
|
FIND_LIBRARY(MKL_INTELTHREAD_LIBRARY
|
|
mkl_intel_thread
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
|
|
# MKL on Mac OS doesn't ship with GNU thread versions, only Intel versions (see above)
|
|
IF(NOT APPLE)
|
|
FIND_LIBRARY(MKL_GNUTHREAD_LIBRARY
|
|
mkl_gnu_thread
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
ENDIF()
|
|
|
|
# Intel Libraries
|
|
IF("${MKL_ARCH_DIR}" STREQUAL "32")
|
|
FIND_LIBRARY(MKL_LP_LIBRARY
|
|
mkl_intel
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
|
|
FIND_LIBRARY(MKL_ILP_LIBRARY
|
|
mkl_intel
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
else()
|
|
FIND_LIBRARY(MKL_LP_LIBRARY
|
|
mkl_intel_lp64
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
|
|
FIND_LIBRARY(MKL_ILP_LIBRARY
|
|
mkl_intel_ilp64
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
ENDIF()
|
|
|
|
# Lapack
|
|
FIND_LIBRARY(MKL_LAPACK_LIBRARY
|
|
mkl_lapack
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
|
|
IF(NOT MKL_LAPACK_LIBRARY)
|
|
FIND_LIBRARY(MKL_LAPACK_LIBRARY
|
|
mkl_lapack95_lp64
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
ENDIF()
|
|
|
|
IF(NOT MKL_LAPACK_LIBRARY)
|
|
FIND_LIBRARY(MKL_LAPACK_LIBRARY
|
|
mkl_intel_lp64
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}
|
|
${MKL_ROOT_DIR}/lib/
|
|
)
|
|
ENDIF()
|
|
|
|
# iomp5
|
|
IF("${MKL_ARCH_DIR}" STREQUAL "32")
|
|
IF(UNIX AND NOT APPLE)
|
|
FIND_LIBRARY(MKL_IOMP5_LIBRARY
|
|
iomp5
|
|
PATHS
|
|
${MKL_ROOT_DIR}/../lib/ia32
|
|
)
|
|
ELSE()
|
|
SET(MKL_IOMP5_LIBRARY "") # no need for mac
|
|
ENDIF()
|
|
else()
|
|
IF(UNIX AND NOT APPLE)
|
|
FIND_LIBRARY(MKL_IOMP5_LIBRARY
|
|
iomp5
|
|
PATHS
|
|
${MKL_ROOT_DIR}/lib/intel64
|
|
${MKL_ROOT_DIR}/../lib/intel64
|
|
)
|
|
ELSE()
|
|
SET(MKL_IOMP5_LIBRARY "") # no need for mac
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
foreach (MODEVAR ${MKL_MODE_VARIANTS})
|
|
foreach (THREADVAR ${MKL_THREAD_VARIANTS})
|
|
if (MKL_CORE_LIBRARY AND MKL_${MODEVAR}_LIBRARY AND MKL_${THREADVAR}_LIBRARY)
|
|
set(MKL_${MODEVAR}_${THREADVAR}_LIBRARIES
|
|
${MKL_${MODEVAR}_LIBRARY} ${MKL_${THREADVAR}_LIBRARY} ${MKL_CORE_LIBRARY}
|
|
${MKL_LAPACK_LIBRARY} ${MKL_IOMP5_LIBRARY})
|
|
# message("${MODEVAR} ${THREADVAR} ${MKL_${MODEVAR}_${THREADVAR}_LIBRARIES}") # for debug
|
|
endif()
|
|
endforeach()
|
|
endforeach()
|
|
|
|
IF(APPLE)
|
|
SET(MKL_LIBRARIES ${MKL_LP_INTELTHREAD_LIBRARIES})
|
|
ELSE()
|
|
SET(MKL_LIBRARIES ${MKL_LP_GNUTHREAD_LIBRARIES})
|
|
ENDIF()
|
|
|
|
MARK_AS_ADVANCED(MKL_CORE_LIBRARY MKL_LP_LIBRARY MKL_ILP_LIBRARY
|
|
MKL_SEQUENTIAL_LIBRARY MKL_INTELTHREAD_LIBRARY MKL_GNUTHREAD_LIBRARY)
|
|
ENDIF()
|
|
|
|
INCLUDE(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(MKL DEFAULT_MSG MKL_INCLUDE_DIR MKL_LIBRARIES)
|
|
|
|
#if(MKL_FOUND)
|
|
# LINK_DIRECTORIES(${MKL_ROOT_DIR}/lib/${MKL_ARCH_DIR}) # hack
|
|
#endif()
|
|
|
|
MARK_AS_ADVANCED(MKL_INCLUDE_DIR MKL_LIBRARIES)
|