Files
paddlepaddle--paddle/cmake/external/onednn.cmake
T
2026-07-13 12:40:42 +08:00

155 lines
5.7 KiB
CMake

# Copyright (c) 2017-2023 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
include(ExternalProject)
set(ONEDNN_PROJECT "extern_onednn")
set(ONEDNN_PREFIX_DIR ${THIRD_PARTY_PATH}/onednn)
set(ONEDNN_INSTALL_DIR ${THIRD_PARTY_PATH}/install/onednn)
set(ONEDNN_INC_DIR
"${ONEDNN_INSTALL_DIR}/include"
CACHE PATH "oneDNN include directory." FORCE)
set(SOURCE_DIR ${PADDLE_SOURCE_DIR}/third_party/onednn)
# Introduce variables:
# * CMAKE_INSTALL_LIBDIR
include(GNUInstallDirs)
set(LIBDIR "lib")
if(CMAKE_INSTALL_LIBDIR MATCHES ".*lib64$")
set(LIBDIR "lib64")
endif()
message(STATUS "Set ${ONEDNN_INSTALL_DIR}/${LIBDIR} to runtime path")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH}"
"${ONEDNN_INSTALL_DIR}/${LIBDIR}")
include_directories(${ONEDNN_INC_DIR}
)# For oneDNN code to include internal headers.
# For CMake >= 4.0.0, set policy compatibility for oneDNN's CMake.
set(ONEDNN_POLICY_ARGS "")
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0.0")
message(
WARNING
"oneDNN: forcing CMake policy compatibility for CMake >= 4.0 (CMAKE_POLICY_VERSION_MINIMUM=3.5)"
)
set(ONEDNN_POLICY_ARGS "-DCMAKE_POLICY_VERSION_MINIMUM=3.5")
endif()
if(NOT WIN32)
set(ONEDNN_FLAG
"-Wno-error=strict-overflow -Wno-error=unused-result -Wno-error=array-bounds"
)
set(ONEDNN_FLAG "${ONEDNN_FLAG} -Wno-unused-result -Wno-unused-value")
set(ONEDNN_CFLAG "${CMAKE_C_FLAGS} ${ONEDNN_FLAG}")
set(ONEDNN_CXXFLAG "${CMAKE_CXX_FLAGS} ${ONEDNN_FLAG}")
set(ONEDNN_CXXFLAG_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
set(ONEDNN_CFLAG_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
set(ONEDNN_LIB
"${ONEDNN_INSTALL_DIR}/${LIBDIR}/libdnnl.so"
CACHE FILEPATH "oneDNN library." FORCE)
else()
set(ONEDNN_CXXFLAG "${CMAKE_CXX_FLAGS} /EHsc")
set(ONEDNN_CFLAG "${CMAKE_C_FLAGS}")
string(REPLACE "/O2 " "" ONEDNN_CFLAG_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
string(REPLACE "/O2 " "" ONEDNN_CXXFLAG_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
set(ONEDNN_LIB
"${ONEDNN_INSTALL_DIR}/bin/mkldnn.lib"
CACHE FILEPATH "oneDNN library." FORCE)
endif()
if(LINUX)
set(BUILD_BYPRODUCTS_ARGS ${ONEDNN_LIB})
else()
set(BUILD_BYPRODUCTS_ARGS "")
endif()
ExternalProject_Add(
${ONEDNN_PROJECT}
${EXTERNAL_PROJECT_LOG_ARGS}
SOURCE_DIR ${SOURCE_DIR}
DEPENDS ${ONEDNN_DEPENDS}
PREFIX ${ONEDNN_PREFIX_DIR}
UPDATE_COMMAND ""
#BUILD_ALWAYS 1
CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_FLAGS=${ONEDNN_CXXFLAG}
-DCMAKE_CXX_FLAGS_RELEASE=${ONEDNN_CXXFLAG_RELEASE}
-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
-DCMAKE_C_FLAGS=${ONEDNN_CFLAG}
-DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
-DCMAKE_C_FLAGS_RELEASE=${ONEDNN_CFLAG_RELEASE}
-DCMAKE_INSTALL_PREFIX=${ONEDNN_INSTALL_DIR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DDNNL_BUILD_TESTS=OFF
-DDNNL_BUILD_EXAMPLES=OFF
${ONEDNN_POLICY_ARGS}
CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${ONEDNN_INSTALL_DIR}
BUILD_BYPRODUCTS ${BUILD_BYPRODUCTS_ARGS})
message(STATUS "OneDNN library: ${ONEDNN_LIB}")
add_definitions(-DPADDLE_WITH_DNNL)
# copy the real so.0 lib to install dir
# it can be directly contained in wheel or capi
if(WIN32)
set(ONEDNN_SHARED_LIB ${ONEDNN_INSTALL_DIR}/bin/mkldnn.dll)
file(TO_NATIVE_PATH ${ONEDNN_INSTALL_DIR} NATIVE_ONEDNN_INSTALL_DIR)
file(TO_NATIVE_PATH ${ONEDNN_SHARED_LIB} NATIVE_ONEDNN_SHARED_LIB)
add_custom_command(
OUTPUT ${ONEDNN_LIB}
COMMAND (copy ${NATIVE_ONEDNN_INSTALL_DIR}\\bin\\dnnl.dll
${NATIVE_ONEDNN_SHARED_LIB} /Y)
COMMAND dumpbin /exports ${ONEDNN_INSTALL_DIR}/bin/mkldnn.dll >
${ONEDNN_INSTALL_DIR}/bin/exports.txt
COMMAND echo LIBRARY mkldnn > ${ONEDNN_INSTALL_DIR}/bin/mkldnn.def
COMMAND echo EXPORTS >> ${ONEDNN_INSTALL_DIR}/bin/mkldnn.def
COMMAND
echo off && (for
/f
"skip=19 tokens=4"
%A
in
(${ONEDNN_INSTALL_DIR}/bin/exports.txt)
do
echo
%A
>>
${ONEDNN_INSTALL_DIR}/bin/mkldnn.def) && echo on
COMMAND lib /def:${ONEDNN_INSTALL_DIR}/bin/mkldnn.def /out:${ONEDNN_LIB}
/machine:x64
COMMENT "Generate mkldnn.lib manually--->"
DEPENDS ${ONEDNN_PROJECT}
VERBATIM)
add_custom_target(onednn_cmd ALL DEPENDS ${ONEDNN_LIB})
else()
set(ONEDNN_SHARED_LIB ${ONEDNN_INSTALL_DIR}/libdnnl.so.3)
add_custom_command(
OUTPUT ${ONEDNN_SHARED_LIB}
COMMAND ${CMAKE_COMMAND} -E copy ${ONEDNN_LIB} ${ONEDNN_SHARED_LIB}
DEPENDS ${ONEDNN_PROJECT})
add_custom_target(onednn_cmd ALL DEPENDS ${ONEDNN_SHARED_LIB})
endif()
# generate a static dummy target to track onednn dependencies
# for cc_library(xxx SRCS xxx.c DEPS onednn)
generate_dummy_static_lib(LIB_NAME "onednn" GENERATOR "onednn.cmake")
target_link_libraries(onednn ${ONEDNN_LIB} ${MKLML_IOMP_LIB})
add_dependencies(onednn ${ONEDNN_PROJECT} onednn_cmd)