xref: /aosp_15_r20/external/pytorch/cmake/Modules/FindMKLDNN.cmake (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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