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