2 # The script to detect Intel(R) Math Kernel Library (MKL)
6 # MKL_ROOT_DIR / ENV{MKLROOT}
9 # MKL_USE_SINGLE_DYNAMIC_LIBRARY - use single dynamic library mkl_rt.lib / libmkl_rt.so
10 # MKL_WITH_TBB / MKL_WITH_OPENMP
15 # On return this will define:
17 # HAVE_MKL - True if Intel MKL found
18 # MKL_ROOT_DIR - root of MKL installation
19 # MKL_INCLUDE_DIRS - MKL include folder
20 # MKL_LIBRARIES - MKL libraries that are used by OpenCV
25 set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
29 macro(get_mkl_version VERSION_FILE)
30 # read MKL version info from file
31 file(STRINGS ${VERSION_FILE} STR1 REGEX "__INTEL_MKL__")
32 file(STRINGS ${VERSION_FILE} STR2 REGEX "__INTEL_MKL_MINOR__")
33 file(STRINGS ${VERSION_FILE} STR3 REGEX "__INTEL_MKL_UPDATE__")
34 #file(STRINGS ${VERSION_FILE} STR4 REGEX "INTEL_MKL_VERSION")
36 # extract info and assign to variables
37 string(REGEX MATCHALL "[0-9]+" MKL_VERSION_MAJOR ${STR1})
38 string(REGEX MATCHALL "[0-9]+" MKL_VERSION_MINOR ${STR2})
39 string(REGEX MATCHALL "[0-9]+" MKL_VERSION_UPDATE ${STR3})
40 set(MKL_VERSION_STR "${MKL_VERSION_MAJOR}.${MKL_VERSION_MINOR}.${MKL_VERSION_UPDATE}" CACHE STRING "MKL version" FORCE)
43 OCV_OPTION(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use MKL Single Dynamic Library thorugh mkl_rt.lib / libmkl_rt.so" OFF)
44 OCV_OPTION(MKL_WITH_TBB "Use MKL with TBB multithreading" OFF)#ON IF WITH_TBB)
45 OCV_OPTION(MKL_WITH_OPENMP "Use MKL with OpenMP multithreading" OFF)#ON IF WITH_OPENMP)
47 if(NOT MKL_ROOT_DIR AND DEFINED MKL_INCLUDE_DIR AND EXISTS "${MKL_INCLUDE_DIR}/mkl.h")
48 file(TO_CMAKE_PATH "${MKL_INCLUDE_DIR}" MKL_INCLUDE_DIR)
49 get_filename_component(MKL_ROOT_DIR "${MKL_INCLUDE_DIR}/.." ABSOLUTE)
52 file(TO_CMAKE_PATH "${MKL_ROOT_DIR}" mkl_root_paths)
53 if(DEFINED ENV{MKLROOT})
54 file(TO_CMAKE_PATH "$ENV{MKLROOT}" path)
55 list(APPEND mkl_root_paths "${path}")
58 if(WITH_MKL AND NOT mkl_root_paths)
60 set(ProgramFilesx86 "ProgramFiles(x86)")
61 file(TO_CMAKE_PATH "$ENV{${ProgramFilesx86}}" path)
62 list(APPEND mkl_root_paths ${path}/IntelSWTools/compilers_and_libraries/windows/mkl)
65 list(APPEND mkl_root_paths "/opt/intel/mkl")
69 find_path(MKL_ROOT_DIR include/mkl.h PATHS ${mkl_root_paths})
72 if(NOT MKL_ROOT_DIR OR NOT EXISTS "${MKL_ROOT_DIR}/include/mkl.h")
76 set(MKL_INCLUDE_DIR "${MKL_ROOT_DIR}/include" CACHE PATH "Path to MKL include directory")
79 OR NOT EXISTS "${MKL_ROOT_DIR}"
80 OR NOT EXISTS "${MKL_INCLUDE_DIR}"
81 OR NOT EXISTS "${MKL_INCLUDE_DIR}/mkl_version.h"
86 get_mkl_version(${MKL_INCLUDE_DIR}/mkl_version.h)
89 if(CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
90 set(MKL_ARCH_LIST "intel64")
92 list(APPEND MKL_ARCH_LIST "win-x64")
94 include(CheckTypeSize)
95 CHECK_TYPE_SIZE(int _sizeof_int)
96 if (_sizeof_int EQUAL 4)
97 set(MKL_ARCH_SUFFIX "lp64")
99 set(MKL_ARCH_SUFFIX "ilp64")
102 set(MKL_ARCH_LIST "ia32")
103 set(MKL_ARCH_SUFFIX "c")
106 set(mkl_lib_find_paths ${MKL_LIB_FIND_PATHS} ${MKL_ROOT_DIR}/lib)
107 foreach(MKL_ARCH ${MKL_ARCH_LIST})
108 list(APPEND mkl_lib_find_paths
109 ${MKL_ROOT_DIR}/lib/${MKL_ARCH}
110 ${MKL_ROOT_DIR}/${MKL_ARCH}
114 if(MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT (MKL_VERSION_STR VERSION_LESS "10.3.0"))
116 # https://software.intel.com/content/www/us/en/develop/articles/a-new-linking-model-single-dynamic-library-mkl_rt-since-intel-mkl-103.html
117 set(mkl_lib_list "mkl_rt")
119 elseif(NOT (MKL_VERSION_STR VERSION_LESS "11.3.0"))
121 foreach(MKL_ARCH ${MKL_ARCH_LIST})
122 list(APPEND mkl_lib_find_paths
123 ${MKL_ROOT_DIR}/../tbb/lib/${MKL_ARCH}
127 set(mkl_lib_list "mkl_intel_${MKL_ARCH_SUFFIX}")
130 list(APPEND mkl_lib_list mkl_tbb_thread tbb)
131 elseif(MKL_WITH_OPENMP)
133 list(APPEND mkl_lib_list mkl_intel_thread libiomp5md)
135 list(APPEND mkl_lib_list mkl_gnu_thread)
138 list(APPEND mkl_lib_list mkl_sequential)
141 list(APPEND mkl_lib_list mkl_core)
143 message(STATUS "MKL version ${MKL_VERSION_STR} is not supported")
147 if(NOT MKL_LIBRARIES)
148 set(MKL_LIBRARIES "")
149 foreach(lib ${mkl_lib_list})
150 set(lib_var_name MKL_LIBRARY_${lib})
151 find_library(${lib_var_name} NAMES ${lib} ${lib}_dll HINTS ${mkl_lib_find_paths})
152 mark_as_advanced(${lib_var_name})
153 if(NOT ${lib_var_name})
156 list(APPEND MKL_LIBRARIES ${${lib_var_name}})
160 message(STATUS "Found MKL ${MKL_VERSION_STR} at: ${MKL_ROOT_DIR}")
162 set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
163 set(MKL_INCLUDE_DIRS "${MKL_INCLUDE_DIR}")
164 set(MKL_LIBRARIES "${MKL_LIBRARIES}")
165 if(UNIX AND NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT MKL_LIBRARIES_DONT_HACK)
166 #it's ugly but helps to avoid cyclic lib problem
167 set(MKL_LIBRARIES ${MKL_LIBRARIES} ${MKL_LIBRARIES} ${MKL_LIBRARIES} "-lpthread" "-lm" "-ldl")