mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 12:54:11 +08:00
# Motivation As proposed in https://github.com/pytorch/pytorch/issues/114848 and https://github.com/pytorch/pytorch/issues/114723, oneDNN library is an important component for Intel GPU software ecosystem. This PR is intended to enable oneDNN compilation for Intel GPU. It is the first step for we enabling any operators like `at::baddmm`. With this PR, a static library `libdnnl.a` for GPU would be compiled in directory `/build/xpumkldnn_proj-prefix`. It can be further linked to `libtorch_xpu.so` in future. The compilation would depend on `USE_XPU` bool variables and runtime check like SYCL, which is defined in https://github.com/pytorch/pytorch/pull/116019 for runtime support. Once the #116019 merged, the compilation should be able to be triggered. The modification is independent to oneDNN CPU compilation, hence no modification would be introduced for CPU Cmakefiles(e.g. FindMKLDNN.cmake) Co-authored-by: xiaolil1 <xiaoli.liu@intel.com> Co-authored-by: lei,zhenyuan <zhenyuan.lei@intel.com> Pull Request resolved: https://github.com/pytorch/pytorch/pull/117098 Approved by: https://github.com/EikanWang, https://github.com/jgong5, https://github.com/atalman
163 lines
6.5 KiB
CMake
163 lines
6.5 KiB
CMake
# - Try to find MKLDNN
|
|
#
|
|
# The following variables are optionally searched for defaults
|
|
# MKL_FOUND : set to true if a library implementing the CBLAS interface is found
|
|
#
|
|
# The following are set after configuration is done:
|
|
# MKLDNN_FOUND : set to true if mkl-dnn is found.
|
|
# MKLDNN_INCLUDE_DIR : path to mkl-dnn include dir.
|
|
# MKLDNN_LIBRARIES : list of libraries for mkl-dnn
|
|
#
|
|
# The following variables are used:
|
|
# MKLDNN_USE_NATIVE_ARCH : Whether native CPU instructions should be used in MKLDNN. This should be turned off for
|
|
# general packaging to avoid incompatible CPU instructions. Default: OFF.
|
|
|
|
IF(NOT MKLDNN_FOUND)
|
|
SET(MKLDNN_LIBRARIES)
|
|
SET(MKLDNN_INCLUDE_DIR)
|
|
|
|
SET(IDEEP_ROOT "${PROJECT_SOURCE_DIR}/third_party/ideep")
|
|
SET(MKLDNN_ROOT "${PROJECT_SOURCE_DIR}/third_party/ideep/mkl-dnn")
|
|
|
|
if(USE_XPU) # Build oneDNN GPU library
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
set(DNNL_HOST_COMPILER "g++")
|
|
# g++ is soft linked to /usr/bin/cxx, oneDNN would not treat it as an absolute path
|
|
else()
|
|
message(FATAL_ERROR "oneDNN library currently only supports GUN g++ compiler for XPU backend")
|
|
endif()
|
|
|
|
set(DNNL_MAKE_COMMAND "cmake" "--build" ".")
|
|
ExternalProject_Add(xpu_mkldnn_proj
|
|
SOURCE_DIR ${MKLDNN_ROOT}
|
|
PREFIX ${XPU_MKLDNN_DIR_PREFIX}
|
|
BUILD_IN_SOURCE 0
|
|
CMAKE_ARGS -DCMAKE_C_COMPILER=icx
|
|
-DCMAKE_CXX_COMPILER=icpx
|
|
-DCMAKE_CXX_COMPILER_ID=IntelLLVM
|
|
-DDNNL_GPU_RUNTIME=SYCL
|
|
-DDNNL_CPU_RUNTIME=THREADPOOL
|
|
-DDNNL_BUILD_TESTS=OFF
|
|
-DDNNL_BUILD_EXAMPLES=OFF
|
|
-DONEDNN_BUILD_GRAPH=OFF
|
|
-DDNNL_LIBRARY_TYPE=STATIC
|
|
-DDNNL_DPCPP_HOST_COMPILER=${DNNL_HOST_COMPILER} # Use global cxx compiler as host compiler
|
|
-G ${CMAKE_GENERATOR} # Align Generator to Torch
|
|
BUILD_COMMAND ${DNNL_MAKE_COMMAND}
|
|
BUILD_BYPRODUCTS "xpu_mkldnn_proj-prefix/src/xpu_mkldnn_proj-build/src/libdnnl.a"
|
|
INSTALL_COMMAND ""
|
|
)
|
|
|
|
ExternalProject_Get_Property(xpu_mkldnn_proj BINARY_DIR)
|
|
set(__XPU_MKLDNN_BUILD_DIR ${BINARY_DIR})
|
|
set(XPU_MKLDNN_LIBRARIES ${__XPU_MKLDNN_BUILD_DIR}/src/libdnnl.a)
|
|
set(XPU_MKLDNN_INCLUDE ${__XPU_MKLDNN_BUILD_DIR}/include)
|
|
# This target would be further linked to libtorch_xpu.so.
|
|
# The libtorch_xpu.so would contain Conv&GEMM operators that depend on
|
|
# oneDNN primitive implementations inside libdnnl.a.
|
|
add_library(xpu_mkldnn INTERFACE)
|
|
add_dependencies(xpu_mkldnn xpu_mkldnn_proj)
|
|
target_link_libraries(xpu_mkldnn INTERFACE ${__XPU_MKLDNN_BUILD_DIR}/src/libdnnl.a)
|
|
target_include_directories(xpu_mkldnn INTERFACE ${XPU_MKLDNN_INCLUDE})
|
|
endif()
|
|
|
|
IF(NOT APPLE AND NOT WIN32 AND NOT BUILD_LITE_INTERPRETER)
|
|
MESSAGE("-- Will build oneDNN Graph")
|
|
SET(LLGA_ROOT "${PROJECT_SOURCE_DIR}/third_party/ideep/mkl-dnn")
|
|
SET(BUILD_ONEDNN_GRAPH ON)
|
|
SET(ONEDNN_BUILD_GRAPH ON CACHE BOOL "" FORCE)
|
|
ENDIF(NOT APPLE AND NOT WIN32 AND NOT BUILD_LITE_INTERPRETER)
|
|
|
|
FIND_PACKAGE(BLAS)
|
|
FIND_PATH(IDEEP_INCLUDE_DIR ideep.hpp PATHS ${IDEEP_ROOT} PATH_SUFFIXES include)
|
|
FIND_PATH(MKLDNN_INCLUDE_DIR dnnl.hpp dnnl.h PATHS ${MKLDNN_ROOT} PATH_SUFFIXES include/oneapi/dnnl)
|
|
IF(NOT MKLDNN_INCLUDE_DIR)
|
|
MESSAGE("MKLDNN_INCLUDE_DIR not found")
|
|
EXECUTE_PROCESS(COMMAND git${CMAKE_EXECUTABLE_SUFFIX} submodule update --init mkl-dnn WORKING_DIRECTORY ${IDEEP_ROOT})
|
|
FIND_PATH(MKLDNN_INCLUDE_DIR dnnl.hpp dnnl.h PATHS ${MKLDNN_ROOT} PATH_SUFFIXES include)
|
|
ENDIF(NOT MKLDNN_INCLUDE_DIR)
|
|
IF(BUILD_ONEDNN_GRAPH)
|
|
FIND_PATH(LLGA_INCLUDE_DIR dnnl_graph.hpp PATHS ${LLGA_ROOT} PATH_SUFFIXES include/oneapi/dnnl)
|
|
ENDIF(BUILD_ONEDNN_GRAPH)
|
|
|
|
IF(NOT IDEEP_INCLUDE_DIR OR NOT MKLDNN_INCLUDE_DIR)
|
|
MESSAGE(STATUS "MKLDNN source files not found!")
|
|
RETURN()
|
|
ENDIF(NOT IDEEP_INCLUDE_DIR OR NOT MKLDNN_INCLUDE_DIR)
|
|
LIST(APPEND MKLDNN_INCLUDE_DIR ${IDEEP_INCLUDE_DIR})
|
|
IF(BUILD_ONEDNN_GRAPH)
|
|
LIST(APPEND MKLDNN_INCLUDE_DIR ${LLGA_INCLUDE_DIR})
|
|
ENDIF(BUILD_ONEDNN_GRAPH)
|
|
IF(MKL_FOUND)
|
|
ADD_DEFINITIONS(-DIDEEP_USE_MKL)
|
|
# Append to mkldnn dependencies
|
|
LIST(APPEND MKLDNN_LIBRARIES ${MKL_LIBRARIES})
|
|
LIST(APPEND MKLDNN_INCLUDE_DIR ${MKL_INCLUDE_DIR})
|
|
ELSE(MKL_FOUND)
|
|
SET(MKLDNN_USE_MKL "NONE" CACHE STRING "" FORCE)
|
|
ENDIF(MKL_FOUND)
|
|
|
|
SET(MKL_cmake_included TRUE)
|
|
IF(NOT MKLDNN_CPU_RUNTIME)
|
|
SET(MKLDNN_CPU_RUNTIME "OMP" CACHE STRING "")
|
|
ELSEIF(MKLDNN_CPU_RUNTIME STREQUAL "TBB")
|
|
IF(USE_TBB)
|
|
MESSAGE(STATUS "MKL-DNN is using TBB")
|
|
|
|
SET(TBB_cmake_included TRUE)
|
|
SET(Threading_cmake_included TRUE)
|
|
|
|
SET(DNNL_CPU_THREADING_RUNTIME ${MKLDNN_CPU_RUNTIME})
|
|
INCLUDE_DIRECTORIES(${TBB_INCLUDE_DIR})
|
|
LIST(APPEND EXTRA_SHARED_LIBS TBB::tbb)
|
|
ELSE()
|
|
MESSAGE(FATAL_ERROR "MKLDNN_CPU_RUNTIME is set to TBB but TBB is not used")
|
|
ENDIF()
|
|
ENDIF()
|
|
MESSAGE(STATUS "MKLDNN_CPU_RUNTIME = ${MKLDNN_CPU_RUNTIME}")
|
|
|
|
SET(MKLDNN_CPU_RUNTIME ${MKLDNN_CPU_RUNTIME} CACHE STRING "" FORCE)
|
|
SET(DNNL_BUILD_TESTS FALSE CACHE BOOL "" FORCE)
|
|
SET(DNNL_BUILD_EXAMPLES FALSE CACHE BOOL "" FORCE)
|
|
SET(DNNL_LIBRARY_TYPE STATIC CACHE STRING "" FORCE)
|
|
SET(DNNL_ENABLE_PRIMITIVE_CACHE TRUE CACHE BOOL "" FORCE)
|
|
SET(DNNL_GRAPH_CPU_RUNTIME ${MKLDNN_CPU_RUNTIME} CACHE STRING "" FORCE)
|
|
|
|
IF(BUILD_ONEDNN_GRAPH)
|
|
SET(DNNL_GRAPH_LIBRARY_TYPE STATIC CACHE STRING "" FORCE)
|
|
ENDIF(BUILD_ONEDNN_GRAPH)
|
|
IF(MKLDNN_USE_NATIVE_ARCH) # Disable HostOpts in MKLDNN unless MKLDNN_USE_NATIVE_ARCH is set.
|
|
SET(DNNL_ARCH_OPT_FLAGS "HostOpts" CACHE STRING "" FORCE)
|
|
ELSE()
|
|
IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
IF(CPU_INTEL)
|
|
# Do not specify arch in oneDNN build option, for the portability in older systems
|
|
SET(DNNL_ARCH_OPT_FLAGS "" CACHE STRING "" FORCE)
|
|
ELSEIF(CPU_AARCH64)
|
|
SET(DNNL_ARCH_OPT_FLAGS "-mcpu=generic" CACHE STRING "" FORCE)
|
|
ENDIF()
|
|
ELSE()
|
|
SET(DNNL_ARCH_OPT_FLAGS "" CACHE STRING "" FORCE)
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
ADD_SUBDIRECTORY(${MKLDNN_ROOT})
|
|
|
|
IF(NOT TARGET dnnl)
|
|
MESSAGE("Failed to include MKL-DNN target")
|
|
RETURN()
|
|
ENDIF(NOT TARGET dnnl)
|
|
|
|
IF(NOT APPLE AND CMAKE_COMPILER_IS_GNUCC)
|
|
TARGET_COMPILE_OPTIONS(dnnl PRIVATE -Wno-maybe-uninitialized)
|
|
TARGET_COMPILE_OPTIONS(dnnl PRIVATE -Wno-strict-overflow)
|
|
TARGET_COMPILE_OPTIONS(dnnl PRIVATE -Wno-error=strict-overflow)
|
|
ENDIF(NOT APPLE AND CMAKE_COMPILER_IS_GNUCC)
|
|
LIST(APPEND MKLDNN_LIBRARIES ${MKL_OPENMP_LIBRARY})
|
|
LIST(APPEND MKLDNN_LIBRARIES dnnl)
|
|
|
|
SET(MKLDNN_FOUND TRUE)
|
|
MESSAGE(STATUS "Found MKL-DNN: TRUE")
|
|
|
|
ENDIF(NOT MKLDNN_FOUND)
|