1# - Try to find MKLDNN 2# 3# The following variables are optionally searched for defaults 4# MKL_FOUND : set to true if a library implementing the CBLAS interface is found 5# 6# The following are set after configuration is done: 7# MKLDNN_FOUND : set to true if mkl-dnn is found. 8# MKLDNN_INCLUDE_DIR : path to mkl-dnn include dir. 9# MKLDNN_LIBRARIES : list of libraries for mkl-dnn 10# 11# The following variables are used: 12# MKLDNN_USE_NATIVE_ARCH : Whether native CPU instructions should be used in MKLDNN. This should be turned off for 13# general packaging to avoid incompatible CPU instructions. Default: OFF. 14 15IF(NOT MKLDNN_FOUND) 16 SET(MKLDNN_LIBRARIES) 17 SET(MKLDNN_INCLUDE_DIR) 18 19 SET(IDEEP_ROOT "${PROJECT_SOURCE_DIR}/third_party/ideep") 20 SET(MKLDNN_ROOT "${PROJECT_SOURCE_DIR}/third_party/ideep/mkl-dnn") 21 22 if(USE_XPU) # Build oneDNN GPU library 23 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 24 # Linux 25 # g++ is soft linked to /usr/bin/cxx, oneDNN would not treat it as an absolute path 26 set(DNNL_HOST_COMPILER "g++") 27 set(SYCL_CXX_DRIVER "icpx") 28 set(DNNL_LIB_NAME "libdnnl.a") 29 else() 30 # Windows 31 set(DNNL_HOST_COMPILER "DEFAULT") 32 set(SYCL_CXX_DRIVER "icx") 33 set(DNNL_LIB_NAME "dnnl.lib") 34 endif() 35 36 set(DNNL_MAKE_COMMAND "cmake" "--build" ".") 37 include(ProcessorCount) 38 ProcessorCount(proc_cnt) 39 if((DEFINED ENV{MAX_JOBS}) AND ("$ENV{MAX_JOBS}" LESS_EQUAL ${proc_cnt})) 40 list(APPEND DNNL_MAKE_COMMAND "-j" "$ENV{MAX_JOBS}") 41 if(CMAKE_GENERATOR MATCHES "Make|Ninja") 42 list(APPEND DNNL_MAKE_COMMAND "--" "-l" "$ENV{MAX_JOBS}") 43 endif() 44 endif() 45 if(LINUX) 46 set(DNNL_CXX_FLAGS "-DCMAKE_CXX_FLAGS=-fpreview-breaking-changes") 47 else() 48 set(DNNL_CXX_FLAGS "") 49 endif() 50 ExternalProject_Add(xpu_mkldnn_proj 51 SOURCE_DIR ${MKLDNN_ROOT} 52 PREFIX ${XPU_MKLDNN_DIR_PREFIX} 53 BUILD_IN_SOURCE 0 54 CMAKE_ARGS -DCMAKE_C_COMPILER=icx 55 -DCMAKE_CXX_COMPILER=${SYCL_CXX_DRIVER} 56 ${DNNL_CXX_FLAGS} 57 -DDNNL_GPU_RUNTIME=SYCL 58 -DDNNL_CPU_RUNTIME=THREADPOOL 59 -DDNNL_BUILD_TESTS=OFF 60 -DDNNL_BUILD_EXAMPLES=OFF 61 -DONEDNN_BUILD_GRAPH=OFF 62 -DDNNL_LIBRARY_TYPE=STATIC 63 -DDNNL_DPCPP_HOST_COMPILER=${DNNL_HOST_COMPILER} # Use global cxx compiler as host compiler 64 -G ${CMAKE_GENERATOR} # Align Generator to Torch 65 BUILD_COMMAND ${DNNL_MAKE_COMMAND} 66 BUILD_BYPRODUCTS "xpu_mkldnn_proj-prefix/src/xpu_mkldnn_proj-build/src/${DNNL_LIB_NAME}" 67 INSTALL_COMMAND "" 68 ) 69 70 ExternalProject_Get_Property(xpu_mkldnn_proj BINARY_DIR) 71 set(__XPU_MKLDNN_BUILD_DIR ${BINARY_DIR}) 72 set(XPU_MKLDNN_LIBRARIES ${__XPU_MKLDNN_BUILD_DIR}/src/${DNNL_LIB_NAME}) 73 set(XPU_MKLDNN_INCLUDE ${__XPU_MKLDNN_BUILD_DIR}/include) 74 # This target would be further linked to libtorch_xpu.so. 75 # The libtorch_xpu.so would contain Conv&GEMM operators that depend on 76 # oneDNN primitive implementations inside libdnnl.a. 77 add_library(xpu_mkldnn INTERFACE) 78 add_dependencies(xpu_mkldnn xpu_mkldnn_proj) 79 target_link_libraries(xpu_mkldnn INTERFACE ${__XPU_MKLDNN_BUILD_DIR}/src/${DNNL_LIB_NAME}) 80 target_include_directories(xpu_mkldnn INTERFACE ${XPU_MKLDNN_INCLUDE}) 81 endif() 82 83 IF(NOT APPLE AND NOT WIN32 AND NOT BUILD_LITE_INTERPRETER) 84 MESSAGE("-- Will build oneDNN Graph") 85 SET(LLGA_ROOT "${PROJECT_SOURCE_DIR}/third_party/ideep/mkl-dnn") 86 SET(BUILD_ONEDNN_GRAPH ON) 87 SET(ONEDNN_BUILD_GRAPH ON CACHE BOOL "" FORCE) 88 ENDIF(NOT APPLE AND NOT WIN32 AND NOT BUILD_LITE_INTERPRETER) 89 90 IF(EXISTS "${MKLDNN_ROOT}/include/oneapi/dnnl/dnnl_ukernel.hpp") 91 MESSAGE("-- Will build oneDNN UKERNEL") 92 SET(DNNL_EXPERIMENTAL_UKERNEL ON CACHE BOOL "" FORCE) 93 ENDIF(EXISTS "${MKLDNN_ROOT}/include/oneapi/dnnl/dnnl_ukernel.hpp") 94 95 FIND_PACKAGE(BLAS) 96 FIND_PATH(IDEEP_INCLUDE_DIR ideep.hpp PATHS ${IDEEP_ROOT} PATH_SUFFIXES include) 97 FIND_PATH(MKLDNN_INCLUDE_DIR dnnl.hpp dnnl.h dnnl_ukernel.hpp dnnl_ukernel.h PATHS ${MKLDNN_ROOT} PATH_SUFFIXES include/oneapi/dnnl) 98 IF(NOT MKLDNN_INCLUDE_DIR) 99 MESSAGE("MKLDNN_INCLUDE_DIR not found") 100 EXECUTE_PROCESS(COMMAND git${CMAKE_EXECUTABLE_SUFFIX} submodule update --init mkl-dnn WORKING_DIRECTORY ${IDEEP_ROOT}) 101 FIND_PATH(MKLDNN_INCLUDE_DIR dnnl.hpp dnnl.h dnnl_ukernel.hpp dnnl_ukernel.h PATHS ${MKLDNN_ROOT} PATH_SUFFIXES include) 102 ENDIF(NOT MKLDNN_INCLUDE_DIR) 103 IF(BUILD_ONEDNN_GRAPH) 104 FIND_PATH(LLGA_INCLUDE_DIR dnnl_graph.hpp PATHS ${LLGA_ROOT} PATH_SUFFIXES include/oneapi/dnnl) 105 ENDIF(BUILD_ONEDNN_GRAPH) 106 107 IF(NOT IDEEP_INCLUDE_DIR OR NOT MKLDNN_INCLUDE_DIR) 108 MESSAGE(STATUS "MKLDNN source files not found!") 109 RETURN() 110 ENDIF(NOT IDEEP_INCLUDE_DIR OR NOT MKLDNN_INCLUDE_DIR) 111 LIST(APPEND MKLDNN_INCLUDE_DIR ${IDEEP_INCLUDE_DIR}) 112 IF(BUILD_ONEDNN_GRAPH) 113 LIST(APPEND MKLDNN_INCLUDE_DIR ${LLGA_INCLUDE_DIR}) 114 ENDIF(BUILD_ONEDNN_GRAPH) 115 IF(MKL_FOUND) 116 ADD_DEFINITIONS(-DIDEEP_USE_MKL) 117 # Append to mkldnn dependencies 118 LIST(APPEND MKLDNN_LIBRARIES ${MKL_LIBRARIES}) 119 LIST(APPEND MKLDNN_INCLUDE_DIR ${MKL_INCLUDE_DIR}) 120 ELSE(MKL_FOUND) 121 SET(MKLDNN_USE_MKL "NONE" CACHE STRING "" FORCE) 122 ENDIF(MKL_FOUND) 123 124 SET(MKL_cmake_included TRUE) 125 IF(NOT MKLDNN_CPU_RUNTIME) 126 SET(MKLDNN_CPU_RUNTIME "OMP" CACHE STRING "") 127 ELSEIF(MKLDNN_CPU_RUNTIME STREQUAL "TBB") 128 IF(TARGET TBB::tbb) 129 MESSAGE(STATUS "MKL-DNN is using TBB") 130 131 SET(TBB_cmake_included TRUE) 132 SET(Threading_cmake_included TRUE) 133 134 SET(DNNL_CPU_THREADING_RUNTIME ${MKLDNN_CPU_RUNTIME}) 135 INCLUDE_DIRECTORIES(${TBB_INCLUDE_DIR}) 136 LIST(APPEND EXTRA_SHARED_LIBS TBB::tbb) 137 ELSE() 138 MESSAGE(FATAL_ERROR "MKLDNN_CPU_RUNTIME is set to TBB but TBB is not used") 139 ENDIF() 140 ENDIF() 141 MESSAGE(STATUS "MKLDNN_CPU_RUNTIME = ${MKLDNN_CPU_RUNTIME}") 142 143 SET(MKLDNN_CPU_RUNTIME ${MKLDNN_CPU_RUNTIME} CACHE STRING "" FORCE) 144 SET(DNNL_BUILD_TESTS FALSE CACHE BOOL "" FORCE) 145 SET(DNNL_BUILD_EXAMPLES FALSE CACHE BOOL "" FORCE) 146 SET(DNNL_LIBRARY_TYPE STATIC CACHE STRING "" FORCE) 147 SET(DNNL_ENABLE_PRIMITIVE_CACHE TRUE CACHE BOOL "" FORCE) 148 SET(DNNL_GRAPH_CPU_RUNTIME ${MKLDNN_CPU_RUNTIME} CACHE STRING "" FORCE) 149 150 IF(BUILD_ONEDNN_GRAPH) 151 SET(DNNL_GRAPH_LIBRARY_TYPE STATIC CACHE STRING "" FORCE) 152 ENDIF(BUILD_ONEDNN_GRAPH) 153 IF(MKLDNN_USE_NATIVE_ARCH) # Disable HostOpts in MKLDNN unless MKLDNN_USE_NATIVE_ARCH is set. 154 SET(DNNL_ARCH_OPT_FLAGS "HostOpts" CACHE STRING "" FORCE) 155 ELSE() 156 IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 157 IF(CPU_INTEL) 158 # Do not specify arch in oneDNN build option, for the portability in older systems 159 SET(DNNL_ARCH_OPT_FLAGS "" CACHE STRING "" FORCE) 160 ELSEIF(CPU_AARCH64) 161 SET(DNNL_ARCH_OPT_FLAGS "-mcpu=generic" CACHE STRING "" FORCE) 162 ENDIF() 163 ELSE() 164 SET(DNNL_ARCH_OPT_FLAGS "" CACHE STRING "" FORCE) 165 ENDIF() 166 ENDIF() 167 168 ADD_SUBDIRECTORY(${MKLDNN_ROOT}) 169 170 IF(NOT TARGET dnnl) 171 MESSAGE("Failed to include MKL-DNN target") 172 RETURN() 173 ENDIF(NOT TARGET dnnl) 174 175 IF(NOT APPLE AND CMAKE_COMPILER_IS_GNUCC) 176 TARGET_COMPILE_OPTIONS(dnnl PRIVATE -Wno-maybe-uninitialized) 177 TARGET_COMPILE_OPTIONS(dnnl PRIVATE -Wno-strict-overflow) 178 TARGET_COMPILE_OPTIONS(dnnl PRIVATE -Wno-error=strict-overflow) 179 ENDIF(NOT APPLE AND CMAKE_COMPILER_IS_GNUCC) 180 LIST(APPEND MKLDNN_LIBRARIES ${MKL_OPENMP_LIBRARY}) 181 LIST(APPEND MKLDNN_LIBRARIES dnnl) 182 183 SET(MKLDNN_FOUND TRUE) 184 MESSAGE(STATUS "Found MKL-DNN: TRUE") 185 186ENDIF(NOT MKLDNN_FOUND) 187