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