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

241 lines
8.7 KiB
CMake

if(NOT WITH_ROCM)
return()
endif()
if(NOT DEFINED ROCM_PATH)
if(DEFINED ENV{ROCM_PATH})
set(ROCM_PATH
$ENV{ROCM_PATH}
CACHE PATH "Path to which ROCm has been installed")
else()
set(ROCM_PATH
"/opt/rocm"
CACHE PATH "Path to which ROCm has been installed")
endif()
endif()
# Determine HIP layout from the available FindHIP module. Hygon/DCU keeps it
# under ROCM_PATH/hip/cmake, while ROCm 7.0+ uses ROCM_PATH/lib/cmake/hip.
if(EXISTS "${ROCM_PATH}/hip/cmake/FindHIP.cmake")
set(HIP_PATH
${ROCM_PATH}/hip
CACHE PATH "Path to which HIP has been installed")
set(CMAKE_MODULE_PATH "${HIP_PATH}/cmake" ${CMAKE_MODULE_PATH})
else()
set(HIP_PATH
${ROCM_PATH}
CACHE PATH "Path to which HIP has been installed")
set(CMAKE_MODULE_PATH "${ROCM_PATH}/lib/cmake/hip" ${CMAKE_MODULE_PATH})
endif()
set(HIP_CLANG_PATH
${ROCM_PATH}/llvm/bin
CACHE PATH "Path to which clang has been installed")
set(CMAKE_PREFIX_PATH "${ROCM_PATH}" ${CMAKE_PREFIX_PATH})
find_package(HIP REQUIRED)
include_directories(${ROCM_PATH}/include)
message(STATUS "HIP version: ${HIP_VERSION}")
message(STATUS "HIP_CLANG_PATH: ${HIP_CLANG_PATH}")
macro(find_hip_version hip_header_file)
file(READ ${hip_header_file} HIP_VERSION_FILE_CONTENTS)
string(REGEX MATCH "define HIP_VERSION_MAJOR +([0-9]+)" HIP_MAJOR_VERSION
"${HIP_VERSION_FILE_CONTENTS}")
string(REGEX REPLACE "define HIP_VERSION_MAJOR +([0-9]+)" "\\1"
HIP_MAJOR_VERSION "${HIP_MAJOR_VERSION}")
string(REGEX MATCH "define HIP_VERSION_MINOR +([0-9]+)" HIP_MINOR_VERSION
"${HIP_VERSION_FILE_CONTENTS}")
string(REGEX REPLACE "define HIP_VERSION_MINOR +([0-9]+)" "\\1"
HIP_MINOR_VERSION "${HIP_MINOR_VERSION}")
string(REGEX MATCH "define HIP_VERSION_PATCH +([0-9]+)" HIP_PATCH_VERSION
"${HIP_VERSION_FILE_CONTENTS}")
string(REGEX REPLACE "define HIP_VERSION_PATCH +([0-9]+)" "\\1"
HIP_PATCH_VERSION "${HIP_PATCH_VERSION}")
if(NOT HIP_MAJOR_VERSION)
set(HIP_VERSION "???")
message(
WARNING "Cannot find HIP version in ${HIP_PATH}/include/hip/hip_version.h"
)
else()
math(
EXPR
HIP_VERSION
"${HIP_MAJOR_VERSION} * 10000000 + ${HIP_MINOR_VERSION} * 100000 + ${HIP_PATCH_VERSION}"
)
message(
STATUS
"Current HIP header is ${HIP_PATH}/include/hip/hip_version.h "
"Current HIP version is v${HIP_MAJOR_VERSION}.${HIP_MINOR_VERSION}.${HIP_PATCH_VERSION}. "
)
endif()
endmacro()
# ROCm 7.0+: hip_version.h is directly under ROCM_PATH/include
if(EXISTS "${ROCM_PATH}/include/hip/hip_version.h")
find_hip_version(${ROCM_PATH}/include/hip/hip_version.h)
elseif(EXISTS "${HIP_PATH}/include/hip/hip_version.h")
find_hip_version(${HIP_PATH}/include/hip/hip_version.h)
else()
message(WARNING "Cannot find hip_version.h")
endif()
if(NOT HIP_VERSION MATCHES "^[0-9]+$")
message(
FATAL_ERROR
"HIP_VERSION is unavailable. Cannot derive PADDLE_ROCM_VERSION for version dispatch."
)
endif()
set(PADDLE_ROCM_VERSION
${HIP_VERSION}
CACHE INTERNAL "ROCm HIP version used for Paddle version dispatch" FORCE)
add_definitions(-DPADDLE_ROCM_VERSION=${PADDLE_ROCM_VERSION})
message(STATUS "PADDLE_ROCM_VERSION: ${PADDLE_ROCM_VERSION}")
# Keep legacy DCU defaults narrow; ROCm 7 adds newer CDNA targets.
if(PADDLE_ROCM_VERSION GREATER_EQUAL 70000000)
set(PADDLE_DEFAULT_AMDGPU_TARGETS
"gfx906;gfx908;gfx90a;gfx926;gfx928;gfx936;gfx942;gfx950")
else()
set(PADDLE_DEFAULT_AMDGPU_TARGETS "gfx906;gfx926;gfx928;gfx936")
endif()
set(PADDLE_AMDGPU_TARGETS
"${PADDLE_DEFAULT_AMDGPU_TARGETS}"
CACHE STRING "Semicolon-separated AMD GPU architectures for HIP offload")
string(REPLACE "," ";" PADDLE_AMDGPU_TARGETS "${PADDLE_AMDGPU_TARGETS}")
string(REPLACE " " ";" PADDLE_AMDGPU_TARGETS "${PADDLE_AMDGPU_TARGETS}")
message(STATUS "PADDLE_AMDGPU_TARGETS: ${PADDLE_AMDGPU_TARGETS}")
macro(find_package_and_include PACKAGE_NAME)
find_package("${PACKAGE_NAME}" REQUIRED)
# ROCm 7.0+ uses /opt/rocm/include/<package>/ instead of /opt/rocm/<package>/include/
if(EXISTS "${ROCM_PATH}/include/${PACKAGE_NAME}")
include_directories("${ROCM_PATH}/include/${PACKAGE_NAME}")
elseif(EXISTS "${ROCM_PATH}/${PACKAGE_NAME}/include")
include_directories("${ROCM_PATH}/${PACKAGE_NAME}/include")
endif()
message(STATUS "${PACKAGE_NAME} version: ${${PACKAGE_NAME}_VERSION}")
endmacro()
if(DEFINED PADDLE_SOURCE_DIR)
set(PADDLE_HIP_PACKAGES
miopen
rocblas
hipblaslt
hiprand
rocrand
rccl
rocthrust
hipcub
rocprim
hipsparse
rocsparse
rocfft
rocsolver)
else()
set(PADDLE_HIP_PACKAGES hiprand rocrand rocthrust)
endif()
foreach(PACKAGE_NAME IN LISTS PADDLE_HIP_PACKAGES)
find_package_and_include(${PACKAGE_NAME})
endforeach()
if(CCACHE_PATH)
set(HIP_HIPCC_EXECUTABLE ${CCACHE_PATH} ${HIP_HIPCC_EXECUTABLE})
endif()
# set CXX flags for HIP
set(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} -D__HIP_PLATFORM_HCC__ -D__HIP_PLATFORM_AMD__ -DROCM_NO_WRAPPER_HEADER_WARNING"
)
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -D__HIP_PLATFORM_HCC__ -D__HIP_PLATFORM_AMD__ -DROCM_NO_WRAPPER_HEADER_WARNING"
)
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_HIP")
set(THRUST_DEVICE_SYSTEM THRUST_DEVICE_SYSTEM_HIP)
# define HIP_CXX_FLAGS
list(APPEND HIP_CXX_FLAGS -fPIC)
list(APPEND HIP_CXX_FLAGS -D__HIP_PLATFORM_HCC__=1)
list(APPEND HIP_CXX_FLAGS -D__HIP_PLATFORM_AMD__=1)
# Note(qili93): HIP has compile conflicts of float16.h as platform::float16 overload std::is_floating_point and std::is_integer
list(APPEND HIP_CXX_FLAGS -D__HIP_NO_HALF_CONVERSIONS__=1)
list(APPEND HIP_CXX_FLAGS -DROCM_NO_WRAPPER_HEADER_WARNING)
list(APPEND HIP_CXX_FLAGS -Wno-macro-redefined)
list(APPEND HIP_CXX_FLAGS -Wno-inconsistent-missing-override)
list(APPEND HIP_CXX_FLAGS -Wno-exceptions)
list(APPEND HIP_CXX_FLAGS -Wno-shift-count-negative)
list(APPEND HIP_CXX_FLAGS -Wno-shift-count-overflow)
list(APPEND HIP_CXX_FLAGS -Wno-unused-command-line-argument)
list(APPEND HIP_CXX_FLAGS -Wno-duplicate-decl-specifier)
list(APPEND HIP_CXX_FLAGS -Wno-implicit-int-float-conversion)
list(APPEND HIP_CXX_FLAGS -Wno-pass-failed)
list(APPEND HIP_CXX_FLAGS -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_HIP)
list(APPEND HIP_CXX_FLAGS -Wno-unused-result)
list(APPEND HIP_CXX_FLAGS -Wno-deprecated-declarations)
list(APPEND HIP_CXX_FLAGS -Wno-format)
list(APPEND HIP_CXX_FLAGS -Wno-dangling-gsl)
list(APPEND HIP_CXX_FLAGS -Wno-unused-value)
list(APPEND HIP_CXX_FLAGS -Wno-braced-scalar-init)
list(APPEND HIP_CXX_FLAGS -Wno-return-type)
list(APPEND HIP_CXX_FLAGS -Wno-pragma-once-outside-header)
list(APPEND HIP_CXX_FLAGS -Wno-deprecated-builtins)
list(APPEND HIP_CXX_FLAGS -Wno-switch)
list(APPEND HIP_CXX_FLAGS -Wno-literal-conversion)
list(APPEND HIP_CXX_FLAGS -Wno-constant-conversion)
list(APPEND HIP_CXX_FLAGS -Wno-defaulted-function-deleted)
list(APPEND HIP_CXX_FLAGS -Wno-sign-compare)
list(APPEND HIP_CXX_FLAGS -Wno-bitwise-instead-of-logical)
list(APPEND HIP_CXX_FLAGS -Wno-unknown-warning-option)
list(APPEND HIP_CXX_FLAGS -Wno-unused-lambda-capture)
list(APPEND HIP_CXX_FLAGS -Wno-unused-variable)
list(APPEND HIP_CXX_FLAGS -Wno-unused-but-set-variable)
list(APPEND HIP_CXX_FLAGS -Wno-reorder-ctor)
list(APPEND HIP_CXX_FLAGS -Wno-deprecated-copy-with-user-provided-copy)
list(APPEND HIP_CXX_FLAGS -Wno-unused-local-typedef)
list(APPEND HIP_CXX_FLAGS -Wno-missing-braces)
list(APPEND HIP_CXX_FLAGS -Wno-sometimes-uninitialized)
list(APPEND HIP_CXX_FLAGS -Wno-deprecated-copy)
list(APPEND HIP_CXX_FLAGS -Wno-pessimizing-move)
list(APPEND HIP_CXX_FLAGS -std=c++17)
list(APPEND HIP_CXX_FLAGS --gpu-max-threads-per-block=1024)
if(CMAKE_BUILD_TYPE MATCHES Debug)
list(APPEND HIP_CXX_FLAGS -g2)
list(APPEND HIP_CXX_FLAGS -O0)
list(APPEND HIP_HIPCC_FLAGS -fdebug-info-for-profiling)
endif()
set(HIP_HCC_FLAGS ${HIP_CXX_FLAGS})
set(HIP_CLANG_FLAGS ${HIP_CXX_FLAGS})
# Ask hcc to generate device code during compilation so we can use
# host linker to link.
list(APPEND HIP_HCC_FLAGS -fno-gpu-rdc)
list(APPEND HIP_CLANG_FLAGS -fno-gpu-rdc)
foreach(amdgpu_target IN LISTS PADDLE_AMDGPU_TARGETS)
if(amdgpu_target)
list(APPEND HIP_HCC_FLAGS --offload-arch=${amdgpu_target})
list(APPEND HIP_CLANG_FLAGS --offload-arch=${amdgpu_target})
endif()
endforeach()
if(HIP_COMPILER STREQUAL clang)
set(hip_library_name amdhip64)
else()
set(hip_library_name hip_hcc)
endif()
message(STATUS "HIP library name: ${hip_library_name}")
# set HIP link libs
find_library(ROCM_HIPRTC_LIB ${hip_library_name} HINTS ${HIP_PATH}/lib)
message(STATUS "ROCM_HIPRTC_LIB: ${ROCM_HIPRTC_LIB}")
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/thrust.cmake")
include(thrust)
endif()
if(WITH_Z100)
add_definitions(-DCINN_WITH_Z100)
endif()