-# - Find Intel MKL\r
# Find the MKL libraries\r
#\r
# Options:\r
#\r
-# MKL_STATAIC : use static linking\r
-# MKL_MULTI_THREADED: use multi-threading\r
-# MKL_SDL : Single Dynamic Library interface\r
+# MKL_USE_SINGLE_DYNAMIC_LIBRARY : use single dynamic library interface\r
+# MKL_USE_STATIC_LIBS : use static libraries\r
+# MKL_MULTI_THREADED : use multi-threading\r
#\r
# This module defines the following variables:\r
#\r
-# MKL_FOUND : True if MKL_INCLUDE_DIR are found\r
-# MKL_INCLUDE_DIR : where to find mkl.h, etc.\r
-# MKL_INCLUDE_DIRS : set when MKL_INCLUDE_DIR found\r
-# MKL_LIBRARIES : the library to link against.\r
+# MKL_FOUND : True mkl is found\r
+# MKL_INCLUDE_DIR : unclude directory\r
+# MKL_LIBRARIES : the libraries to link against.\r
\r
\r
-include(FindPackageHandleStandardArgs)\r
+# ---[ Options\r
+caffe_option(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use single dynamic library interface" ON)\r
+caffe_option(MKL_USE_STATIC_LIBS "Use static libraries" OFF IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY)\r
+caffe_option(MKL_MULTI_THREADED "Use multi-threading" ON IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY)\r
\r
+# ---[ Root folders\r
set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs")\r
-set(MKL_ROOT ${INTEL_ROOT}/mkl CACHE PATH "Folder contains MKL")\r
-\r
-# Find include dir\r
-find_path(MKL_INCLUDE_DIR mkl.h\r
- PATHS ${MKL_ROOT}/include)\r
-\r
-# Find include directory\r
-# There is no include folder under linux\r
-if(WIN32)\r
- find_path(INTEL_INCLUDE_DIR omp.h\r
- PATHS ${INTEL_ROOT}/include)\r
- set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} ${INTEL_INCLUDE_DIR})\r
-endif()\r
+find_path(MKL_ROOT include/mkl.h PATHS $ENV{MKL_ROOT} ${INTEL_ROOT}/mkl\r
+ DOC "Folder contains MKL")\r
\r
-# Find libraries\r
+# ---[ Find include dir\r
+find_path(MKL_INCLUDE_DIR mkl.h PATHS ${MKL_ROOT} PATH_SUFFIXES include)\r
+set(__looked_for MKL_INCLUDE_DIR)\r
\r
-# Handle suffix\r
-set(_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})\r
+# ---[ Find libraries\r
+if(CMAKE_SIZEOF_VOID_P EQUAL 4)\r
+ set(__path_suffixes lib lib/ia32)\r
+else()\r
+ set(__path_suffixes lib lib/intel64)\r
+endif()\r
\r
-if(WIN32)\r
- if(MKL_STATAIC)\r
- set(CMAKE_FIND_LIBRARY_SUFFIXES .lib)\r
- else()\r
- set(CMAKE_FIND_LIBRARY_SUFFIXES _dll.lib)\r
- endif()\r
+set(__mkl_libs "")\r
+if(MKL_USE_SINGLE_DYNAMIC_LIBRARY)\r
+ list(APPEND __mkl_libs rt)\r
else()\r
- if(MKL_STATAIC)\r
- set(CMAKE_FIND_LIBRARY_SUFFIXES .a)\r
+ if(CMAKE_SIZEOF_VOID_P EQUAL 4)\r
+ if(WIN32)\r
+ list(APPEND __mkl_libs intel_c)\r
else()\r
- set(CMAKE_FIND_LIBRARY_SUFFIXES .so)\r
+ list(APPEND __mkl_libs intel gf)\r
endif()\r
+ else()\r
+ list(APPEND __mkl_libs intel_lp64 gf_lp64)\r
+ endif()\r
+\r
+ if(MKL_MULTI_THREADED)\r
+ list(APPEND __mkl_libs intel_thread)\r
+ else()\r
+ list(APPEND __mkl_libs sequential)\r
+ endif()\r
+\r
+ list(APPEND __mkl_libs core cdft_core)\r
endif()\r
\r
\r
-# MKL is composed by four layers: Interface, Threading, Computational and RTL\r
+foreach (__lib ${__mkl_libs})\r
+ set(__mkl_lib "mkl_${__lib}")\r
+ string(TOUPPER ${__mkl_lib} __mkl_lib_upper)\r
\r
-if(MKL_SDL)\r
- find_library(MKL_LIBRARY mkl_rt\r
- PATHS ${MKL_ROOT}/lib/ia32/)\r
+ if(MKL_USE_STATIC_LIBS)\r
+ set(__mkl_lib "lib${__mkl_lib}.a")\r
+ endif()\r
\r
- set(MKL_MINIMAL_LIBRARY ${MKL_LIBRARY})\r
-else()\r
- ######################### Interface layer #######################\r
- if(WIN32)\r
- set(MKL_INTERFACE_LIBNAME mkl_intel_c)\r
- else()\r
- set(MKL_INTERFACE_LIBNAME mkl_intel)\r
- endif()\r
+ find_library(${__mkl_lib_upper}_LIBRARY\r
+ NAMES ${__mkl_lib}\r
+ PATHS ${MKL_ROOT} "${MKL_INCLUDE_DIR}/.."\r
+ PATH_SUFFIXES ${__path_suffixes}\r
+ DOC "The path to Intel(R) MKL ${__mkl_lib} library")\r
+ mark_as_advanced(${__mkl_lib_upper}_LIBRARY)\r
\r
- find_library(MKL_INTERFACE_LIBRARY ${MKL_INTERFACE_LIBNAME}\r
- PATHS ${MKL_ROOT}/lib/ia32/)\r
+ list(APPEND __looked_for ${__mkl_lib_upper}_LIBRARY)\r
+ list(APPEND MKL_LIBRARIES ${${__mkl_lib_upper}_LIBRARY})\r
+endforeach()\r
\r
- ######################## Threading layer ########################\r
- if(MKL_MULTI_THREADED)\r
- set(MKL_THREADING_LIBNAME mkl_intel_thread)\r
- else()\r
- set(MKL_THREADING_LIBNAME mkl_sequential)\r
- endif()\r
\r
- find_library(MKL_THREADING_LIBRARY ${MKL_THREADING_LIBNAME}\r
- PATHS ${MKL_ROOT}/lib/ia32/)\r
+if(NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY)\r
+ if (MKL_USE_STATIC_LIBS)\r
+ set(__iomp5_libs iomp5 libiomp5mt.lib)\r
+ else()\r
+ set(__iomp5_libs iomp5 libiomp5md.lib)\r
+ endif()\r
\r
- ####################### Computational layer #####################\r
- find_library(MKL_CORE_LIBRARY mkl_core\r
- PATHS ${MKL_ROOT}/lib/ia32/)\r
- find_library(MKL_FFT_LIBRARY mkl_cdft_core\r
- PATHS ${MKL_ROOT}/lib/ia32/)\r
- find_library(MKL_SCALAPACK_LIBRARY mkl_scalapack_core\r
- PATHS ${MKL_ROOT}/lib/ia32/)\r
+ if(WIN32)\r
+ find_path(INTEL_INCLUDE_DIR omp.h PATHS ${INTEL_ROOT} PATH_SUFFIXES include)\r
+ list(APPEND __looked_for INTEL_INCLUDE_DIR)\r
+ endif()\r
\r
- ############################ RTL layer ##########################\r
- if(WIN32)\r
- set(MKL_RTL_LIBNAME libiomp5md)\r
- else()\r
- set(MKL_RTL_LIBNAME libiomp5)\r
- endif()\r
- find_library(MKL_RTL_LIBRARY ${MKL_RTL_LIBNAME}\r
- PATHS ${INTEL_RTL_ROOT}/lib)\r
+ find_library(MKL_RTL_LIBRARY ${__iomp5_libs}\r
+ PATHS ${INTEL_RTL_ROOT} ${INTEL_ROOT}/compiler ${MKL_ROOT}/.. ${MKL_ROOT}/../compiler\r
+ PATH_SUFFIXES ${__path_suffixes}\r
+ DOC "Path to Path to OpenMP runtime library")\r
\r
- set(MKL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_FFT_LIBRARY} ${MKL_SCALAPACK_LIBRARY} ${MKL_RTL_LIBRARY})\r
- set(MKL_MINIMAL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_RTL_LIBRARY})\r
+ list(APPEND __looked_for MKL_RTL_LIBRARY)\r
+ list(APPEND MKL_LIBRARIES ${MKL_RTL_LIBRARY})\r
endif()\r
\r
-set(CMAKE_FIND_LIBRARY_SUFFIXES ${_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})\r
\r
-find_package_handle_standard_args(MKL DEFAULT_MSG\r
- MKL_INCLUDE_DIR MKL_LIBRARY MKL_MINIMAL_LIBRARY)\r
+include(FindPackageHandleStandardArgs)\r
+find_package_handle_standard_args(MKL DEFAULT_MSG ${__looked_for})\r
\r
if(MKL_FOUND)\r
- set(MKL_INCLUDE_DIRS ${MKL_INCLUDE_DIR})\r
- set(MKL_LIBRARIES ${MKL_LIBRARY})\r
- set(MKL_MINIMAL_LIBRARIES ${MKL_LIBRARY})\r
+ message(STATUS "Found MKL (include: ${MKL_INCLUDE_DIR}, lib: ${MKL_LIBRARIES}")\r
endif()\r
+\r
+caffe_clear_vars(__looked_for __mkl_libs __path_suffixes __lib_suffix __iomp5_libs)\r