blob: a9276de9cd021651a57a81cc8016c4797aec5071 [file] [log] [blame] [edit]
# - Find INTEL MKL library
#
# This module sets the following variables:
# MKL_FOUND - set to true if a library implementing the CBLAS interface is found
# MKL_VERSION - best guess of the found mkl version
# MKL_INCLUDE_DIR - path to include dir.
# MKL_LIBRARIES - list of libraries for base mkl
# MKL_OPENMP_TYPE - OpenMP flavor that the found mkl uses: GNU or Intel
# MKL_OPENMP_LIBRARY - path to the OpenMP library the found mkl uses
# MKL_LAPACK_LIBRARIES - list of libraries to add for lapack
# MKL_SCALAPACK_LIBRARIES - list of libraries to add for scalapack
# MKL_SOLVER_LIBRARIES - list of libraries to add for the solvers
# MKL_CDFT_LIBRARIES - list of libraries to add for the solvers
# Do nothing if MKL_FOUND was set before!
IF (NOT MKL_FOUND)
SET(MKL_VERSION)
SET(MKL_INCLUDE_DIR)
SET(MKL_LIBRARIES)
SET(MKL_OPENMP_TYPE)
SET(MKL_OPENMP_LIBRARY)
SET(MKL_LAPACK_LIBRARIES)
SET(MKL_SCALAPACK_LIBRARIES)
SET(MKL_SOLVER_LIBRARIES)
SET(MKL_CDFT_LIBRARIES)
# Includes
INCLUDE(CheckTypeSize)
INCLUDE(CheckFunctionExists)
# Set default value of INTEL_COMPILER_DIR and INTEL_MKL_DIR
IF (WIN32)
IF(DEFINED ENV{MKLProductDir})
SET(DEFAULT_INTEL_COMPILER_DIR $ENV{MKLProductDir})
ELSE()
SET(DEFAULT_INTEL_COMPILER_DIR
"C:/Program Files (x86)/IntelSWTools/compilers_and_libraries/windows")
ENDIF()
SET(DEFAULT_INTEL_MKL_DIR "${DEFAULT_INTEL_COMPILER_DIR}/mkl")
if (EXISTS "${DEFAULT_INTEL_COMPILER_DIR}/mkl/latest")
SET(DEFAULT_INTEL_MKL_DIR "${DEFAULT_INTEL_COMPILER_DIR}/mkl/latest")
endif()
ELSE (WIN32)
SET(DEFAULT_INTEL_COMPILER_DIR "/opt/intel")
SET(DEFAULT_INTEL_MKL_DIR "/opt/intel/mkl")
SET(DEFAULT_INTEL_ONEAPI_DIR "/opt/intel/oneapi")
if (EXISTS "${DEFAULT_INTEL_ONEAPI_DIR}")
SET(DEFAULT_INTEL_COMPILER_DIR "${DEFAULT_INTEL_ONEAPI_DIR}")
if (EXISTS "${DEFAULT_INTEL_ONEAPI_DIR}/compiler/latest")
SET(DEFAULT_INTEL_COMPILER_DIR "${DEFAULT_INTEL_ONEAPI_DIR}/compiler/latest")
endif()
if (EXISTS "${DEFAULT_INTEL_ONEAPI_DIR}/mkl/latest")
SET(DEFAULT_INTEL_MKL_DIR "${DEFAULT_INTEL_ONEAPI_DIR}/mkl/latest")
endif()
endif()
ENDIF (WIN32)
# Intel Compiler Suite
SET(INTEL_COMPILER_DIR "${DEFAULT_INTEL_COMPILER_DIR}" CACHE STRING
"Root directory of the Intel Compiler Suite (contains ipp, mkl, etc.)")
SET(INTEL_MKL_DIR "${DEFAULT_INTEL_MKL_DIR}" CACHE STRING
"Root directory of the Intel MKL (standalone)")
SET(INTEL_OMP_DIR "${DEFAULT_INTEL_MKL_DIR}" CACHE STRING
"Root directory of the Intel OpenMP (standalone)")
SET(MKL_THREADING "OMP" CACHE STRING "MKL flavor: SEQ, TBB or OMP (default)")
IF (NOT "${MKL_THREADING}" STREQUAL "SEQ" AND
NOT "${MKL_THREADING}" STREQUAL "TBB" AND
NOT "${MKL_THREADING}" STREQUAL "OMP")
MESSAGE(FATAL_ERROR "Invalid MKL_THREADING (${MKL_THREADING}), should be one of: SEQ, TBB, OMP")
ENDIF()
IF ("${MKL_THREADING}" STREQUAL "TBB" AND NOT TARGET TBB::tbb)
MESSAGE(FATAL_ERROR "MKL_THREADING is TBB but TBB is not found")
ENDIF()
MESSAGE(STATUS "MKL_THREADING = ${MKL_THREADING}")
# Checks
CHECK_TYPE_SIZE("void*" SIZE_OF_VOIDP)
IF ("${SIZE_OF_VOIDP}" EQUAL 8)
SET(mklvers "intel64")
SET(iccvers "intel64")
SET(mkl64s "_lp64")
ELSE ("${SIZE_OF_VOIDP}" EQUAL 8)
SET(mklvers "32")
SET(iccvers "ia32")
SET(mkl64s)
ENDIF ("${SIZE_OF_VOIDP}" EQUAL 8)
IF(WIN32)
IF ("${MKL_THREADING}" STREQUAL "TBB")
SET(mklthreads "mkl_tbb_thread")
IF (CMAKE_BUILD_TYPE STREQUAL Debug)
SET(mklrtls "tbb12_debug")
ELSE ()
SET(mklrtls "tbb12")
ENDIF ()
ELSE()
SET(mklthreads "mkl_intel_thread")
SET(mklrtls "libiomp5md")
ENDIF()
SET(mklifaces "intel")
ELSE(WIN32)
IF(CMAKE_COMPILER_IS_GNUCC)
IF ("${MKL_THREADING}" STREQUAL "TBB")
SET(mklthreads "mkl_tbb_thread")
SET(mklrtls "tbb")
ELSE()
SET(mklthreads "mkl_gnu_thread" "mkl_intel_thread")
SET(mklrtls "gomp" "iomp5")
ENDIF()
SET(mklifaces "intel" "gf")
ELSE(CMAKE_COMPILER_IS_GNUCC)
IF ("${MKL_THREADING}" STREQUAL "TBB")
SET(mklthreads "mkl_tbb_thread")
SET(mklrtls "tbb")
ELSE()
SET(mklthreads "mkl_intel_thread")
SET(mklrtls "iomp5" "guide")
ENDIF()
SET(mklifaces "intel")
ENDIF (CMAKE_COMPILER_IS_GNUCC)
ENDIF(WIN32)
# Kernel libraries dynamically loaded
SET(mklkerlibs "mc" "mc3" "nc" "p4n" "p4m" "p4m3" "p4p" "def")
SET(mklseq)
# Paths
SET(saved_CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH})
SET(saved_CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH})
IF (EXISTS ${INTEL_COMPILER_DIR})
# TODO: diagnostic if dir does not exist
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_COMPILER_DIR}/lib/${iccvers}")
IF(MSVC)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_COMPILER_DIR}/compiler/lib/${iccvers}")
ENDIF()
IF (APPLE)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_COMPILER_DIR}/lib")
ENDIF()
IF (NOT EXISTS ${INTEL_MKL_DIR})
SET(INTEL_MKL_DIR "${INTEL_COMPILER_DIR}/mkl")
ENDIF()
ENDIF()
IF (EXISTS ${INTEL_MKL_DIR})
# TODO: diagnostic if dir does not exist
SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH}
"${INTEL_MKL_DIR}/include")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_MKL_DIR}/lib/${mklvers}")
IF (MSVC)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_MKL_DIR}/lib/${iccvers}")
IF ("${SIZE_OF_VOIDP}" EQUAL 8)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_MKL_DIR}/win-x64")
ENDIF ()
ENDIF()
IF (APPLE)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_MKL_DIR}/lib")
ENDIF()
ENDIF()
IF (EXISTS ${INTEL_OMP_DIR})
# TODO: diagnostic if dir does not exist
SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH}
"${INTEL_OMP_DIR}/include")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_OMP_DIR}/lib/${mklvers}")
IF (MSVC)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_OMP_DIR}/lib/${iccvers}")
IF ("${SIZE_OF_VOIDP}" EQUAL 8)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_OMP_DIR}/win-x64")
ENDIF ()
ENDIF()
IF (APPLE)
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
"${INTEL_OMP_DIR}/lib" "${INTEL_COMPILER_DIR}/mac/compiler/lib")
ENDIF()
ENDIF()
MACRO(GET_MKL_LIB_NAMES LIBRARIES INTERFACE MKL64)
cmake_parse_arguments("" "" "THREAD" "" ${ARGN})
SET(${LIBRARIES} mkl_${INTERFACE}${MKL64} mkl_core)
IF(_THREAD)
LIST(INSERT ${LIBRARIES} 1 ${_THREAD})
IF(UNIX AND ${USE_STATIC_MKL})
# The thread library defines symbols required by the other MKL libraries so also add it last
LIST(APPEND ${LIBRARIES} ${_THREAD})
ENDIF()
ENDIF()
IF(${USE_STATIC_MKL})
IF(UNIX)
list(TRANSFORM ${LIBRARIES} PREPEND "lib")
list(TRANSFORM ${LIBRARIES} APPEND ".a")
ELSE()
message(WARNING "Ignoring USE_STATIC_MKL")
ENDIF()
ENDIF()
ENDMACRO()
# Try linking multiple libs
MACRO(CHECK_ALL_LIBRARIES LIBRARIES OPENMP_TYPE OPENMP_LIBRARY _name _list _flags)
# This macro checks for the existence of the combination of libraries given by _list.
# If the combination is found, this macro checks whether we can link against that library
# combination using the name of a routine given by _name using the linker
# flags given by _flags. If the combination of libraries is found and passes
# the link test, LIBRARIES is set to the list of complete library paths that
# have been found. Otherwise, LIBRARIES is set to FALSE.
# N.B. _prefix is the prefix applied to the names of all cached variables that
# are generated internally and marked advanced by this macro.
SET(_prefix "${LIBRARIES}")
# start checking
SET(_libraries_work TRUE)
SET(${LIBRARIES})
SET(${OPENMP_TYPE})
SET(${OPENMP_LIBRARY})
SET(_combined_name)
SET(_openmp_type)
SET(_openmp_library)
SET(_paths)
IF (NOT MKL_FIND_QUIETLY)
set(_str_list)
foreach(_elem ${_list})
if(_str_list)
set(_str_list "${_str_list} - ${_elem}")
else()
set(_str_list "${_elem}")
endif()
endforeach(_elem)
message(STATUS "Checking for [${_str_list}]")
ENDIF ()
SET(_found_tbb FALSE)
FOREACH(_library ${_list})
SET(_combined_name ${_combined_name}_${_library})
UNSET(${_prefix}_${_library}_LIBRARY)
IF(_libraries_work)
IF(${_library} MATCHES "omp")
IF(_openmp_type)
MESSAGE(FATAL_ERROR "More than one OpenMP libraries appear in the MKL test: ${_list}")
ELSEIF(${_library} MATCHES "gomp")
SET(_openmp_type "GNU")
# Use FindOpenMP to find gomp
FIND_PACKAGE(OpenMP QUIET)
IF(OPENMP_FOUND)
# Test that none of the found library names contains "iomp" (Intel
# OpenMP). This doesn't necessarily mean that we have gomp... but it
# is probably good enough since on gcc we should already have
# OpenMP_CXX_FLAGS="-fopenmp" and OpenMP_CXX_LIB_NAMES="".
SET(_found_gomp true)
FOREACH(_lib_name ${OpenMP_CXX_LIB_NAMES})
IF (_found_gomp AND "${_lib_name}" MATCHES "iomp")
SET(_found_gomp false)
ENDIF()
ENDFOREACH()
IF(_found_gomp)
SET(${_prefix}_${_library}_LIBRARY ${OpenMP_CXX_FLAGS})
SET(_openmp_library "${${_prefix}_${_library}_LIBRARY}")
ENDIF()
ENDIF(OPENMP_FOUND)
ELSEIF(${_library} MATCHES "iomp")
SET(_openmp_type "Intel")
FIND_LIBRARY(${_prefix}_${_library}_LIBRARY NAMES ${_library})
SET(_openmp_library "${${_prefix}_${_library}_LIBRARY}")
ELSE()
MESSAGE(FATAL_ERROR "Unknown OpenMP flavor: ${_library}")
ENDIF()
ELSEIF(${_library} STREQUAL "tbb")
# Separately handling compiled TBB
SET(_found_tbb TRUE)
ELSE()
IF(MSVC)
SET(lib_names ${_library}_dll)
SET(lib_names_static ${_library})
# Both seek shared and static mkl library.
FIND_LIBRARY(${_prefix}_${_library}_LIBRARY NAMES ${lib_names} ${lib_names_static})
ELSE()
SET(lib_names ${_library})
FIND_LIBRARY(${_prefix}_${_library}_LIBRARY NAMES ${lib_names})
ENDIF()
ENDIF()
MARK_AS_ADVANCED(${_prefix}_${_library}_LIBRARY)
IF(NOT (${_library} STREQUAL "tbb"))
SET(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
SET(_libraries_work ${${_prefix}_${_library}_LIBRARY})
IF (NOT MKL_FIND_QUIETLY)
IF(${_prefix}_${_library}_LIBRARY)
MESSAGE(STATUS " Library ${_library}: ${${_prefix}_${_library}_LIBRARY}")
ELSE(${_prefix}_${_library}_LIBRARY)
MESSAGE(STATUS " Library ${_library}: not found")
ENDIF(${_prefix}_${_library}_LIBRARY)
ENDIF ()
ENDIF()
ENDIF(_libraries_work)
ENDFOREACH(_library ${_list})
# Test this combination of libraries.
IF(_libraries_work)
IF (NOT _found_tbb)
SET(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}})
SET(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES};${CMAKE_REQUIRED_LIBRARIES}")
CHECK_FUNCTION_EXISTS(${_name} ${_prefix}${_combined_name}_WORKS)
SET(CMAKE_REQUIRED_LIBRARIES)
MARK_AS_ADVANCED(${_prefix}${_combined_name}_WORKS)
SET(_libraries_work ${${_prefix}${_combined_name}_WORKS})
ENDIF()
ENDIF(_libraries_work)
# Fin
IF(_libraries_work)
SET(${OPENMP_TYPE} ${_openmp_type})
MARK_AS_ADVANCED(${OPENMP_TYPE})
SET(${OPENMP_LIBRARY} ${_openmp_library})
MARK_AS_ADVANCED(${OPENMP_LIBRARY})
ELSE (_libraries_work)
SET(${LIBRARIES})
MARK_AS_ADVANCED(${LIBRARIES})
ENDIF(_libraries_work)
ENDMACRO(CHECK_ALL_LIBRARIES)
IF(WIN32)
SET(mkl_m "")
SET(mkl_pthread "")
ELSE(WIN32)
SET(mkl_m "m")
SET(mkl_pthread "pthread")
ENDIF(WIN32)
IF(UNIX AND NOT APPLE)
SET(mkl_dl "${CMAKE_DL_LIBS}")
ELSE(UNIX AND NOT APPLE)
SET(mkl_dl "")
ENDIF(UNIX AND NOT APPLE)
# Check for version 10/11
IF (NOT MKL_LIBRARIES)
SET(MKL_VERSION 1011)
ENDIF (NOT MKL_LIBRARIES)
# First: search for parallelized ones with intel thread lib
IF (NOT "${MKL_THREADING}" STREQUAL "SEQ")
FOREACH(mklrtl ${mklrtls} "")
FOREACH(mkliface ${mklifaces})
FOREACH(mkl64 ${mkl64s} "")
FOREACH(mklthread ${mklthreads})
IF (NOT MKL_LIBRARIES)
GET_MKL_LIB_NAMES(mkl_lib_names "${mkliface}" "${mkl64}" THREAD "${mklthread}")
CHECK_ALL_LIBRARIES(MKL_LIBRARIES MKL_OPENMP_TYPE MKL_OPENMP_LIBRARY cblas_sgemm
"${mkl_lib_names};${mklrtl};${mkl_pthread};${mkl_m};${mkl_dl}" "")
ENDIF (NOT MKL_LIBRARIES)
ENDFOREACH(mklthread)
ENDFOREACH(mkl64)
ENDFOREACH(mkliface)
ENDFOREACH(mklrtl)
ENDIF (NOT "${MKL_THREADING}" STREQUAL "SEQ")
# Second: search for sequential ones
FOREACH(mkliface ${mklifaces})
FOREACH(mkl64 ${mkl64s} "")
IF (NOT MKL_LIBRARIES)
GET_MKL_LIB_NAMES(mkl_lib_names "${mkliface}" "${mkl64}" THREAD "mkl_sequential")
CHECK_ALL_LIBRARIES(MKL_LIBRARIES MKL_OPENMP_TYPE MKL_OPENMP_LIBRARY cblas_sgemm
"${mkl_lib_names};${mkl_m};${mkl_dl}" "")
IF (MKL_LIBRARIES)
SET(mklseq "_sequential")
ENDIF (MKL_LIBRARIES)
ENDIF (NOT MKL_LIBRARIES)
ENDFOREACH(mkl64)
ENDFOREACH(mkliface)
# First: search for parallelized ones with native pthread lib
FOREACH(mklrtl ${mklrtls} "")
FOREACH(mkliface ${mklifaces})
FOREACH(mkl64 ${mkl64s} "")
IF (NOT MKL_LIBRARIES)
GET_MKL_LIB_NAMES(mkl_lib_names "${mkliface}" "${mkl64}" THREAD "${mklthread}")
CHECK_ALL_LIBRARIES(MKL_LIBRARIES MKL_OPENMP_TYPE MKL_OPENMP_LIBRARY cblas_sgemm
"${mkl_lib_names};${mklrtl};pthread;${mkl_m};${mkl_dl}" "")
ENDIF (NOT MKL_LIBRARIES)
ENDFOREACH(mkl64)
ENDFOREACH(mkliface)
ENDFOREACH(mklrtl)
IF (MKL_LIBRARIES)
SET(CMAKE_REQUIRED_LIBRARIES ${MKL_LIBRARIES})
check_function_exists("cblas_gemm_bf16bf16f32" MKL_HAS_SBGEMM)
check_function_exists("cblas_gemm_f16f16f32" MKL_HAS_SHGEMM)
set(CMAKE_REQUIRED_LIBRARIES)
IF(MKL_HAS_SBGEMM)
add_compile_options(-DMKL_HAS_SBGEMM)
ENDIF(MKL_HAS_SBGEMM)
IF(MKL_HAS_SHGEMM)
add_compile_options(-DMKL_HAS_SHGEMM)
ENDIF(MKL_HAS_SHGEMM)
ENDIF (MKL_LIBRARIES)
# Check for older versions
IF (NOT MKL_LIBRARIES)
SET(MKL_VERSION 900)
if (USE_STATIC_MKL)
message(WARNING "Ignoring USE_STATIC_MKL")
endif()
CHECK_ALL_LIBRARIES(MKL_LIBRARIES MKL_OPENMP_TYPE MKL_OPENMP_LIBRARY cblas_sgemm
"mkl;guide;pthread;m" "")
ENDIF (NOT MKL_LIBRARIES)
# Include files
IF (MKL_LIBRARIES)
FIND_PATH(MKL_INCLUDE_DIR NAMES "mkl_cblas.h" PATHS "/usr/include/mkl")
MARK_AS_ADVANCED(MKL_INCLUDE_DIR)
ENDIF (MKL_LIBRARIES)
# Other libraries
IF (MKL_LIBRARIES)
FOREACH(mkl64 ${mkl64s} "_core" "")
FOREACH(mkls ${mklseq} "")
IF (NOT MKL_LAPACK_LIBRARIES)
FIND_LIBRARY(MKL_LAPACK_LIBRARIES NAMES "mkl_lapack${mkl64}${mkls}")
MARK_AS_ADVANCED(MKL_LAPACK_LIBRARIES)
ENDIF (NOT MKL_LAPACK_LIBRARIES)
IF (NOT MKL_LAPACK_LIBRARIES)
FIND_LIBRARY(MKL_LAPACK_LIBRARIES NAMES "mkl_lapack95${mkl64}${mkls}")
MARK_AS_ADVANCED(MKL_LAPACK_LIBRARIES)
ENDIF (NOT MKL_LAPACK_LIBRARIES)
IF (NOT MKL_SCALAPACK_LIBRARIES)
FIND_LIBRARY(MKL_SCALAPACK_LIBRARIES NAMES "mkl_scalapack${mkl64}${mkls}")
MARK_AS_ADVANCED(MKL_SCALAPACK_LIBRARIES)
ENDIF (NOT MKL_SCALAPACK_LIBRARIES)
IF (NOT MKL_SOLVER_LIBRARIES)
FIND_LIBRARY(MKL_SOLVER_LIBRARIES NAMES "mkl_solver${mkl64}${mkls}")
MARK_AS_ADVANCED(MKL_SOLVER_LIBRARIES)
ENDIF (NOT MKL_SOLVER_LIBRARIES)
IF (NOT MKL_CDFT_LIBRARIES)
FIND_LIBRARY(MKL_CDFT_LIBRARIES NAMES "mkl_cdft${mkl64}${mkls}")
MARK_AS_ADVANCED(MKL_CDFT_LIBRARIES)
ENDIF (NOT MKL_CDFT_LIBRARIES)
ENDFOREACH(mkls)
ENDFOREACH(mkl64)
ENDIF (MKL_LIBRARIES)
# Final
SET(CMAKE_LIBRARY_PATH ${saved_CMAKE_LIBRARY_PATH})
SET(CMAKE_INCLUDE_PATH ${saved_CMAKE_INCLUDE_PATH})
IF (MKL_LIBRARIES AND MKL_INCLUDE_DIR)
SET(MKL_FOUND TRUE)
ELSE (MKL_LIBRARIES AND MKL_INCLUDE_DIR)
if (MKL_LIBRARIES AND NOT MKL_INCLUDE_DIR)
MESSAGE(WARNING "MKL libraries files are found, but MKL header files are \
not. You can get them by `conda install mkl-include` if using conda (if \
it is missing, run `conda upgrade -n root conda` first), and \
`pip install mkl-devel` if using pip. If build fails with header files \
available in the system, please make sure that CMake will search the \
directory containing them, e.g., by setting CMAKE_INCLUDE_PATH.")
endif()
SET(MKL_FOUND FALSE)
SET(MKL_VERSION) # clear MKL_VERSION
ENDIF (MKL_LIBRARIES AND MKL_INCLUDE_DIR)
# Standard termination
IF(NOT MKL_FOUND AND MKL_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "MKL library not found. Please specify library location \
by appending the root directory of the MKL installation to the environment variable CMAKE_PREFIX_PATH.")
ENDIF(NOT MKL_FOUND AND MKL_FIND_REQUIRED)
IF(NOT MKL_FIND_QUIETLY)
IF(MKL_FOUND)
MESSAGE(STATUS "MKL library found")
ELSE(MKL_FOUND)
MESSAGE(STATUS "MKL library not found")
ENDIF(MKL_FOUND)
ENDIF(NOT MKL_FIND_QUIETLY)
# Do nothing if MKL_FOUND was set before!
ENDIF (NOT MKL_FOUND)