Commit 3a1e2ad8 authored by one's avatar one
Browse files

[dtk-local-overrides] Add standalone dtk-local-overrides

- Add installer for files that override or augment /opt/dtk
- Add ROCm 7 based hip-config.cmake split into AMD/NVIDIA configs
- Adapt HIP AMD config to DTK layout and hip::galaxyhip target
- Add amdclang wrapper to rewrite invalid --gcc-toolchain=/opt/dtk/llvm
parent ed6ba736
# DTK Local Overrides
维护需要覆盖到 DTK 软件栈目录 `DTK_HOME=/opt/dtk` 中的修改版文件。目录下的相对路径一般来说和 `$DTK_HOME` 下的相对路径保持一致。
例如:
```text
./hip/lib/cmake/hip/hip-config.cmake
```
会覆盖容器中的:
```text
/opt/dtk/hip/lib/cmake/hip/hip-config.cmake
```
## 安装方式
把本目录下载到容器中,进入目录后执行:
```sh
./install.sh
```
安装前会为已存在的目标文件生成带时间戳的 `.bak.*` 备份。
## 可直接覆盖的文件
这部分记录可以直接覆盖到 DTK 软件栈中的文件,这些文件在目录中的相对路径和 `$DTK_HOME` 下的相对路径一致。
### `hip/lib/cmake/hip/hip-config.cmake`
| 类型 | 路径 |
| --- | --- |
| 来源文件 | `hip/lib/cmake/hip/hip-config.cmake` |
| 原始备份 | `hip/lib/cmake/hip/hip-config.cmake.orig` |
| 历史修正版 | `hip/lib/cmake/hip/hip-config.cmake.patched` |
| 目标文件 | `$DTK_HOME/hip/lib/cmake/hip/hip-config.cmake` |
> 参考:[ROCm 7 hipamd](https://github.com/ROCm/rocm-systems/tree/therock-7.13/projects/clr/hipamd)
修复内容:
1. 基于 ROCm 7 最新 `hip-config.cmake.in` 生成 `hip-config.cmake`
`.cmake.in` 中的 `@PACKAGE_INIT@`、安装路径、`HIP_INSTALLS_HIPCC` 等 configure-time 占位符按当前 DTK 容器布局展开。
2. 保留 ROCm 的平台检测入口。
当前 DTK 的 `hipconfig --platform` 输出为 `amd`,因此主配置在 `HIP_PLATFORM STREQUAL "amd"` 分支中会加载适配后的子配置:
```text
hip-config-amd.cmake
```
### `hip/lib/cmake/hip/hip-config-amd.cmake`
| 类型 | 路径 |
| --- | --- |
| 来源文件 | `hip/lib/cmake/hip/hip-config-amd.cmake` |
| ROCm 参考 | `rocm-references/hip-config-amd.cmake.in` |
| 目标文件 | `$DTK_HOME/hip/lib/cmake/hip/hip-config-amd.cmake` |
修复内容:
1. 按 DTK 容器布局设置默认 `ROCM_PATH`
ROCm 7 默认把 `ROCM_PATH` 设为 HIP package prefix。当前 DTK 中 HIP package prefix 是 `/opt/dtk/hip`,而 LLVM、device libs、`amdgpu-arch` 等组件位于 `/opt/dtk` 下。因此本文件在未显式设置 `ROCM_PATH` 时使用:
```text
${PACKAGE_PREFIX_DIR}/..
```
2. 不再硬编码多组 GPU targets。
DTK 原始文件默认设置:
```text
gfx906;gfx926;gfx928;gfx936;gfx938
```
现在沿用 ROCm 逻辑:优先使用 `GPU_TARGETS`,兼容旧变量 `AMDGPU_TARGETS`;如果没有显式设置,则通过 `$ROCM_PATH/llvm/bin/amdgpu-arch` 自动检测。例如容器中该检测结果可能是 `gfx936`,避免 device link 阶段混入多组 target。
3. 限制 `hip::device` 的 HIP 编译选项只作用于 CXX 语言。
DTK 原始文件将 `-xhip``--offload-arch=...` 无条件挂到 `hip::device``INTERFACE_COMPILE_OPTIONS` 上。Trilinos 通过 `Kokkos::kokkos -> roc::rocthrust -> roc::rocprim_hip -> hip::device` 继承这些选项后,legacy C target 也会带上 HIP 编译参数,导致 Ifpack/ML/Tpetra/Sacado 等 `.c` 文件被按 HIP/C++ 编译。
现在沿用 ROCm 的 helper,通过 CMake 生成表达式把这些选项限制到 `CXX` 编译语言,避免污染 C target。
### `hip/lib/cmake/hip/hip-config-nvidia.cmake`
| 类型 | 路径 |
| --- | --- |
| 来源文件 | `hip/lib/cmake/hip/hip-config-nvidia.cmake` |
| ROCm 参考 | `rocm-references/hip-config-nvidia.cmake.in` |
| 目标文件 | `$DTK_HOME/hip/lib/cmake/hip/hip-config-nvidia.cmake` |
当前 DTK 适配不使用 NVIDIA 分支,但 `hip-config.cmake` 保留了 `HIP_PLATFORM STREQUAL "nvidia"` 时加载该文件的路径。为了便于和上游同步,本文件也随 overlay 一起安装。
该文件来自 ROCm 7 的 `hip-config-nvidia.cmake.in`,只将 `@PACKAGE_INCLUDE_INSTALL_DIR@` 展开为:
```text
${HIP_PACKAGE_PREFIX_DIR}/include
```
## 非直接覆盖的文件
这部分记录不能按相同相对路径直接覆盖的文件。例如源文件是本地工具脚本,安装时会生成 DTK 目录中的一个或多个命令入口。
### `tools/dtk-amdclang-wrapper`
| 类型 | 路径 |
| --- | --- |
| 来源文件 | `tools/dtk-amdclang-wrapper` |
| 目标文件 | `$DTK_HOME/llvm/bin/amdclang` |
| 目标文件 | `$DTK_HOME/llvm/bin/amdclang++` |
修复内容:
Spack ROCm/CMake HIP language 可能会给 `amdclang++` 传入:
```text
--gcc-toolchain=/opt/dtk/llvm
```
`/opt/dtk/llvm` 是 DTK LLVM/DCC 前缀,不是系统 GCC toolchain 前缀,这会导致 host 侧 C++ 标准库头文件查找失败,例如:
```text
fatal error: 'cmath' file not found
```
该 wrapper 安装为 `$DTK_HOME/llvm/bin/amdclang``$DTK_HOME/llvm/bin/amdclang++`,默认转发到:
```text
/opt/dtk/llvm/bin/dcc
```
转发时改写参数 `--gcc-toolchain=/opt/dtk/llvm``--gcc-toolchain=/usr`
# Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
#
# SPDX-License-Identifier: MIT
# Number of parallel jobs by default is 1
if(NOT DEFINED HIP_CLANG_NUM_PARALLEL_JOBS)
set(HIP_CLANG_NUM_PARALLEL_JOBS 1)
endif()
# Windows Specific Definition here:
if(WIN32)
if(DEFINED ENV{HIP_PATH})
file(TO_CMAKE_PATH "$ENV{HIP_PATH}" HIP_PATH)
elseif(DEFINED ENV{HIP_DIR})
file(TO_CMAKE_PATH "$ENV{HIP_DIR}" HIP_DIR)
else()
# using the HIP found
set(HIP_PATH ${PACKAGE_PREFIX_DIR})
endif()
else()
# Linux
# If HIP is not installed under ROCm, need this to find HSA assuming HSA is under ROCm
if(DEFINED ENV{ROCM_PATH})
set(ROCM_PATH "$ENV{ROCM_PATH}")
endif()
# set a default path for ROCM_PATH
if(NOT DEFINED ROCM_PATH)
get_filename_component(ROCM_PATH "${PACKAGE_PREFIX_DIR}/.." ABSOLUTE)
endif()
endif()
if(WIN32)
# Using SDK folder
file(TO_CMAKE_PATH "${HIP_PATH}" HIP_CLANG_ROOT)
if (NOT EXISTS "${HIP_CLANG_ROOT}/bin/clang.exe")
# if using install folder
file(TO_CMAKE_PATH "${HIP_PATH}/../lc" HIP_CLANG_ROOT)
endif()
else()
set(HIP_CLANG_ROOT "${ROCM_PATH}/llvm")
endif()
if(NOT HIP_CXX_COMPILER)
set(HIP_CXX_COMPILER ${CMAKE_CXX_COMPILER})
endif()
if(NOT WIN32)
find_dependency(AMDDeviceLibs HINTS ${ROCM_PATH} PATHS "/opt/rocm")
endif()
if(DEFINED AMDGPU_TARGETS AND NOT DEFINED GPU_TARGETS)
message(AUTHOR_WARNING "AMDGPU_TARGETS is deprecated. Please use GPU_TARGETS instead.")
# Set GPU_TARGETS to the value of AMDGPU_TARGETS
set(GPU_TARGETS "${AMDGPU_TARGETS}")
endif()
# If GPU_TARGETS is not defined by the app, amdgpu-arch is run to find the gpu archs
# of all the devices present in the machine
if(NOT GPU_TARGETS)
if(TRUE)
if (WIN32)
set(AMDGPU_ARCH "${HIP_CLANG_ROOT}/bin/amdgpu-arch.exe")
else()
set(AMDGPU_ARCH "${HIP_CLANG_ROOT}/bin/amdgpu-arch")
endif()
else()
set(AMDGPU_ARCH "${ROCM_PATH}/bin/rocm_agent_enumerator")
endif()
execute_process(
COMMAND ${AMDGPU_ARCH}
RESULT_VARIABLE AMDGPU_ARCH_RESULT
OUTPUT_VARIABLE AMDGPU_ARCH_OUTPUT
ERROR_VARIABLE AMDGPU_ARCH_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if(AMDGPU_ARCH_ERROR)
message(AUTHOR_WARNING
" GPU_TARGETS was not set, and system GPU detection was unsuccsessful.\n \n"
" The amdgpu-arch tool failed:\n"
" Error: '${AMDGPU_ARCH_ERROR}'\n"
" Output: '${AMDGPU_ARCH_OUTPUT}'\n \n"
" As a result, --offload-arch will not be set for subsequent\n"
" compilations, and the default architecture\n"
" (gfx906 for dynamic build / gfx942 for static build) will be used\n"
" for compiling device code in C++ language mode\n")
else()
# rocm_agent_enumerator adds gfx000 entry
string(REPLACE "gfx000\n" "" AMDGPU_ARCH_OUTPUT "${AMDGPU_ARCH_OUTPUT}")
if (NOT AMDGPU_ARCH_OUTPUT STREQUAL "")
string(REPLACE "\n" ";" AMDGPU_ARCH_OUTPUT ${AMDGPU_ARCH_OUTPUT})
set(GPU_TARGETS ${AMDGPU_ARCH_OUTPUT} CACHE STRING "AMD GPU targets to compile for")
endif()
endif()
endif()
if (NOT GPU_TARGETS AND NOT TRUE)
# The default architecture is gfx942 for static build
set(GPU_TARGETS "gfx942" CACHE STRING "AMD GPU targets to compile for")
endif()
if(GPU_TARGETS)
list(REMOVE_DUPLICATES GPU_TARGETS)
endif()
set(GPU_BUILD_TARGETS "${GPU_TARGETS}" CACHE STRING "GPU targets to compile for")
if(NOT WIN32)
find_dependency(amd_comgr HINTS ${ROCM_PATH} PATHS "/opt/rocm")
endif()
include( "${CMAKE_CURRENT_LIST_DIR}/hip-targets.cmake" )
#Using find_dependency to locate the dependency for the packages
#This makes the cmake generated file xxxx-targets to supply the linker libraries
# without worrying other transitive dependencies
if(NOT WIN32)
find_dependency(hsa-runtime64 HINTS ${ROCM_PATH} PATHS "/opt/rocm")
find_dependency(Threads)
endif()
set(_IMPORT_PREFIX ${HIP_PACKAGE_PREFIX_DIR})
# Right now this is only supported for amd platforms
set_target_properties(hip::host PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "__HIP_PLATFORM_HCC__=1;__HIP_PLATFORM_AMD__=1"
)
if(TARGET hip::amdhip64)
set(_HIP_RUNTIME_TARGET hip::amdhip64)
elseif(TARGET hip::galaxyhip)
set(_HIP_RUNTIME_TARGET hip::galaxyhip)
else()
message(FATAL_ERROR "Neither hip::amdhip64 nor hip::galaxyhip is defined by hip-targets.cmake")
endif()
set_target_properties(${_HIP_RUNTIME_TARGET} PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "__HIP_ROCclr__=1"
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
)
if(NOT WIN32)
set_target_properties(hip::device PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
)
endif()
get_property(compilePropIsSet TARGET hip::device PROPERTY INTERFACE_COMPILE_OPTIONS SET)
if (NOT compilePropIsSet)
hip_add_interface_compile_flags(hip::device -x hip)
endif()
hip_add_interface_link_flags(hip::device --hip-link)
foreach(GPU_TARGET ${GPU_BUILD_TARGETS})
if (NOT compilePropIsSet)
hip_add_interface_compile_flags(hip::device --offload-arch=${GPU_TARGET})
endif()
hip_add_interface_link_flags(hip::device --offload-arch=${GPU_TARGET})
endforeach()
#Add support for parallel build and link
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
check_cxx_compiler_flag("-parallel-jobs=1" HIP_CLANG_SUPPORTS_PARALLEL_JOBS)
endif()
if(HIP_CLANG_NUM_PARALLEL_JOBS GREATER 1)
if(${HIP_CLANG_SUPPORTS_PARALLEL_JOBS} )
if (NOT compilePropIsSet)
hip_add_interface_compile_flags(hip::device -parallel-jobs=${HIP_CLANG_NUM_PARALLEL_JOBS} -Wno-format-nonliteral)
endif()
hip_add_interface_link_flags(hip::device -parallel-jobs=${HIP_CLANG_NUM_PARALLEL_JOBS})
else()
message(AUTHOR_WARNING "clang compiler doesn't support parallel jobs")
endif()
endif()
# Use HIP_CXX option -print-libgcc-file-name --rtlib=compiler-rt
# To fetch the compiler rt library file name.
execute_process(
COMMAND ${CMAKE_COMMAND} -E env HIPCC_VERBOSE=0
${HIP_CXX_COMPILER} -print-libgcc-file-name --rtlib=compiler-rt
OUTPUT_VARIABLE CLANGRT_BUILTINS
ERROR_VARIABLE CLANGRT_Error
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE CLANGRT_BUILTINS_FETCH_EXIT_CODE)
if( CLANGRT_Error )
if (HIP_CXX_COMPILER MATCHES ".*clang\\+\\+")
message(AUTHOR_WARNING "${HIP_CXX_COMPILER}: CLANGRT compiler options not supported.")
endif()
else()
# Add support for __fp16 and _Float16, explicitly link with compiler-rt
if( "${CLANGRT_BUILTINS_FETCH_EXIT_CODE}" STREQUAL "0" )
# The HIP_CXX_COMPILER by default prefers backward slashes for path seperators on windows.
# Prefer forward slashes here to avoid escaping issues on certain build systems.
if(WIN32)
string(REPLACE "\\" "/" CLANGRT_BUILTINS ${CLANGRT_BUILTINS})
endif()
# CLANG_RT Builtins found Successfully Set interface link libraries property
set_property(TARGET hip::host APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${CLANGRT_BUILTINS}")
set_property(TARGET hip::device APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${CLANGRT_BUILTINS}")
else()
message(AUTHOR_WARNING "clangrt builtins lib not found: ${CLANGRT_BUILTINS_FETCH_EXIT_CODE}")
endif() # CLANGRT_BUILTINS_FETCH_EXIT_CODE Check
endif() # CLANGRT_Error Check
# Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
#
# SPDX-License-Identifier: MIT
foreach(__lib device host amdhip64)
if (NOT TARGET hip::${__lib})
add_library(hip::${__lib} INTERFACE IMPORTED)
set_target_properties(hip::${__lib} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${HIP_PACKAGE_PREFIX_DIR}/include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${HIP_PACKAGE_PREFIX_DIR}/include")
endif()
endforeach()
# Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
#
# SPDX-License-Identifier: MIT
####### Expanded from \@PACKAGE_INIT\@ by local DTK override #######
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
macro(set_and_check _var _file)
set(${_var} "${_file}")
if(NOT EXISTS "${_file}")
message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
endif()
endmacro()
macro(check_required_components _NAME)
foreach(comp ${${_NAME}_FIND_COMPONENTS})
if(NOT ${_NAME}_${comp}_FOUND)
if(${_NAME}_FIND_REQUIRED_${comp})
set(${_NAME}_FOUND FALSE)
endif()
endif()
endforeach()
endmacro()
include(CheckCXXCompilerFlag)
include(CMakeFindDependencyMacro OPTIONAL RESULT_VARIABLE _CMakeFindDependencyMacro_FOUND)
if (NOT _CMakeFindDependencyMacro_FOUND)
macro(find_dependency dep)
if (NOT ${dep}_FOUND)
set(cmake_fd_version)
if (${ARGC} GREATER 1)
set(cmake_fd_version ${ARGV1})
endif()
set(cmake_fd_exact_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION_EXACT)
set(cmake_fd_exact_arg EXACT)
endif()
set(cmake_fd_quiet_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
set(cmake_fd_quiet_arg QUIET)
endif()
set(cmake_fd_required_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
set(cmake_fd_required_arg REQUIRED)
endif()
find_package(${dep} ${cmake_fd_version}
${cmake_fd_exact_arg}
${cmake_fd_quiet_arg}
${cmake_fd_required_arg}
)
string(TOUPPER ${dep} cmake_dep_upper)
if (NOT ${dep}_FOUND AND NOT ${cmake_dep_upper}_FOUND)
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE "${CMAKE_FIND_PACKAGE_NAME} could not be found because dependency ${dep} could not be found.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND False)
return()
endif()
set(cmake_fd_version)
set(cmake_fd_required_arg)
set(cmake_fd_quiet_arg)
set(cmake_fd_exact_arg)
endif()
endmacro()
endif()
set(_HIP_SHELL "SHELL:")
if(CMAKE_VERSION VERSION_LESS 3.12)
set(_HIP_SHELL "")
endif()
function(hip_add_interface_compile_flags TARGET)
set_property(TARGET ${TARGET} APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:${_HIP_SHELL}${ARGN}>"
)
endfunction()
function(hip_add_interface_link_flags TARGET)
if(CMAKE_VERSION VERSION_LESS 3.20)
set_property(TARGET ${TARGET} APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "${ARGN}"
)
else()
set_property(TARGET ${TARGET} APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "$<$<LINK_LANGUAGE:CXX>:${ARGN}>"
)
endif()
endfunction()
set(HIP_PACKAGE_PREFIX_DIR ${PACKAGE_PREFIX_DIR})
set_and_check( hip_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include" )
set_and_check( hip_INCLUDE_DIRS "${hip_INCLUDE_DIR}" )
set_and_check( hip_LIB_INSTALL_DIR "${PACKAGE_PREFIX_DIR}/lib" )
set_and_check( hip_BIN_INSTALL_DIR "${PACKAGE_PREFIX_DIR}/bin" )
if(TRUE)
if (WIN32)
set_and_check(hip_HIPCC_EXECUTABLE "${hip_BIN_INSTALL_DIR}/hipcc.exe")
set_and_check(hip_HIPCONFIG_EXECUTABLE "${hip_BIN_INSTALL_DIR}/hipconfig.exe")
else()
set_and_check(hip_HIPCC_EXECUTABLE "${hip_BIN_INSTALL_DIR}/hipcc")
set_and_check(hip_HIPCONFIG_EXECUTABLE "${hip_BIN_INSTALL_DIR}/hipconfig")
endif()
else()
# Fallback: find hipcc relative to this config (e.g. when /opt/rocm/bin did not exist at build time).
# hip-config.cmake is in <prefix>/lib/cmake/hip/, so bin is ../../bin
# hip-config.cmake is in <prefix>/lib/cmake/hip/, so bin is at <prefix>/bin
set(_hip_prefix "${HIP_PACKAGE_PREFIX_DIR}")
find_program(hip_HIPCC_EXECUTABLE hipcc PATHS "${_hip_prefix}/bin" NO_DEFAULT_PATH)
if(hip_HIPCC_EXECUTABLE)
message(STATUS "HIP: Using hipcc from relative path: ${hip_HIPCC_EXECUTABLE}")
endif()
find_program(hip_HIPCONFIG_EXECUTABLE hipconfig PATHS "${_hip_prefix}/bin" NO_DEFAULT_PATH)
unset(_hip_prefix)
unset(_hip_config_dir)
endif()
if(NOT DEFINED HIP_PLATFORM)
if(NOT DEFINED ENV{HIP_PLATFORM})
# Try using hip_HIPCONFIG_EXECUTABLE first, if it is available.
if(DEFINED hip_HIPCONFIG_EXECUTABLE AND NOT hip_HIPCONFIG_EXECUTABLE STREQUAL "")
execute_process(
COMMAND ${hip_HIPCONFIG_EXECUTABLE} --platform
OUTPUT_VARIABLE HIP_PLATFORM
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _hipconfig_result
ERROR_VARIABLE _hipconfig_error
)
if(_hipconfig_result EQUAL 0 AND NOT HIP_PLATFORM STREQUAL "")
message(STATUS "HIP_PLATFORM using hip_HIPCONFIG_EXECUTABLE: ${HIP_PLATFORM}")
else()
message(WARNING "Failed to detect HIP_PLATFORM using hip_HIPCONFIG_EXECUTABLE (${hip_HIPCONFIG_EXECUTABLE}): ${_hipconfig_error}")
unset(HIP_PLATFORM)
endif()
endif()
# Fallback to finding a hipconfig executable on PATH if needed.
if(NOT DEFINED HIP_PLATFORM OR HIP_PLATFORM STREQUAL "")
find_program(HIPCONFIG_EXEC hipconfig)
execute_process(
COMMAND ${HIPCONFIG_EXEC} --platform
OUTPUT_VARIABLE HIP_PLATFORM
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _hipconfig_fallback_result
ERROR_VARIABLE _hipconfig_fallback_error
)
if(_hipconfig_fallback_result EQUAL 0 AND NOT HIP_PLATFORM STREQUAL "")
message(STATUS "HIP_PLATFORM using HIPCONFIG_EXEC: ${HIP_PLATFORM}")
else()
message(FATAL_ERROR "Failed to detect HIP_PLATFORM using HIPCONFIG_EXEC (${HIPCONFIG_EXEC}): ${_hipconfig_fallback_error}")
endif()
endif()
else()
set(HIP_PLATFORM $ENV{HIP_PLATFORM} CACHE STRING "HIP Platform")
endif()
endif()
if(HIP_PLATFORM STREQUAL "amd")
set(HIP_RUNTIME "rocclr")
set(HIP_COMPILER "clang")
include( "${hip_LIB_INSTALL_DIR}/cmake/hip/hip-config-amd.cmake" )
elseif(HIP_PLATFORM STREQUAL "nvidia")
set(HIP_RUNTIME "cuda")
set(HIP_COMPILER "nvcc")
include( "${hip_LIB_INSTALL_DIR}/cmake/hip/hip-config-nvidia.cmake" )
else()
message(FATAL_ERROR "Unexpected HIP_PLATFORM: ${HIP_PLATFORM}")
endif()
set( hip_LIBRARIES hip::host hip::device)
set( hip_LIBRARY ${hip_LIBRARIES})
set(HIP_INCLUDE_DIR ${hip_INCLUDE_DIR})
set(HIP_INCLUDE_DIRS ${hip_INCLUDE_DIRS})
set(HIP_LIB_INSTALL_DIR ${hip_LIB_INSTALL_DIR})
set(HIP_BIN_INSTALL_DIR ${hip_BIN_INSTALL_DIR})
set(HIP_LIBRARIES ${hip_LIBRARIES})
set(HIP_LIBRARY ${hip_LIBRARY})
set(HIP_HIPCC_EXECUTABLE ${hip_HIPCC_EXECUTABLE})
set(HIP_HIPCONFIG_EXECUTABLE ${hip_HIPCONFIG_EXECUTABLE})
\ No newline at end of file
####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
####### Any changes to this file will be overwritten by the next CMake run ####
####### The input file was hip-config.cmake.in ########
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
macro(set_and_check _var _file)
set(${_var} "${_file}")
if(NOT EXISTS "${_file}")
message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
endif()
endmacro()
macro(check_required_components _NAME)
foreach(comp ${${_NAME}_FIND_COMPONENTS})
if(NOT ${_NAME}_${comp}_FOUND)
if(${_NAME}_FIND_REQUIRED_${comp})
set(${_NAME}_FOUND FALSE)
endif()
endif()
endforeach()
endmacro()
####################################################################################
include(CheckCXXCompilerFlag)
include(CMakeFindDependencyMacro OPTIONAL RESULT_VARIABLE _CMakeFindDependencyMacro_FOUND)
if (NOT _CMakeFindDependencyMacro_FOUND)
macro(find_dependency dep)
if (NOT ${dep}_FOUND)
set(cmake_fd_version)
if (${ARGC} GREATER 1)
set(cmake_fd_version ${ARGV1})
endif()
set(cmake_fd_exact_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION_EXACT)
set(cmake_fd_exact_arg EXACT)
endif()
set(cmake_fd_quiet_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
set(cmake_fd_quiet_arg QUIET)
endif()
set(cmake_fd_required_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
set(cmake_fd_required_arg REQUIRED)
endif()
find_package(${dep} ${cmake_fd_version}
${cmake_fd_exact_arg}
${cmake_fd_quiet_arg}
${cmake_fd_required_arg}
)
string(TOUPPER ${dep} cmake_dep_upper)
if (NOT ${dep}_FOUND AND NOT ${cmake_dep_upper}_FOUND)
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE "${CMAKE_FIND_PACKAGE_NAME} could not be found because dependency ${dep} could not be found.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND False)
return()
endif()
set(cmake_fd_version)
set(cmake_fd_required_arg)
set(cmake_fd_quiet_arg)
set(cmake_fd_exact_arg)
endif()
endmacro()
endif()
#Number of parallel jobs by default is 1
if(NOT DEFINED HIP_CLANG_NUM_PARALLEL_JOBS)
set(HIP_CLANG_NUM_PARALLEL_JOBS 1)
endif()
set(HIP_COMPILER "clang")
set(HIP_RUNTIME "rocclr")
set_and_check( hip_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include" )
set_and_check( hip_INCLUDE_DIRS "${hip_INCLUDE_DIR}" )
set_and_check( hip_LIB_INSTALL_DIR "${PACKAGE_PREFIX_DIR}/lib" )
set_and_check( hip_BIN_INSTALL_DIR "${PACKAGE_PREFIX_DIR}/bin" )
set_and_check(hip_HIPCC_EXECUTABLE "${hip_BIN_INSTALL_DIR}/hipcc")
set_and_check(hip_HIPCONFIG_EXECUTABLE "${hip_BIN_INSTALL_DIR}/hipconfig")
# Windows Specific Definition here:
if(WIN32)
if(DEFINED ENV{HIP_PATH})
set(HIP_PATH "$ENV{HIP_PATH}")
elseif(DEFINED ENV{HIP_DIR})
set(HIP_PATH "$ENV{HIP_DIR}")
else()
set(HIP_PATH "C:/Program Files/AMD HIP SDK/hip")
endif()
else()
# Linux - set a default path for ROCM_PATH
if(NOT DEFINED ROCM_PATH)
set(ROCM_PATH /opt/rocm)
endif()
#If HIP is not installed under ROCm, need this to find HSA assuming HSA is under ROCm
if(DEFINED ENV{ROCM_PATH})
set(ROCM_PATH "$ENV{ROCM_PATH}")
endif()
endif()
if(HIP_COMPILER STREQUAL "clang")
if(WIN32)
set(HIP_CLANG_ROOT "${HIP_PATH}")
else()
set(HIP_CLANG_ROOT "${ROCM_PATH}/llvm")
endif()
if(NOT HIP_CXX_COMPILER)
set(HIP_CXX_COMPILER ${CMAKE_CXX_COMPILER})
endif()
if(HIP_CXX_COMPILER MATCHES ".*hipcc")
execute_process(COMMAND ${HIP_CXX_COMPILER} --version
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE HIP_CLANG_CXX_COMPILER_VERSION_OUTPUT)
if(HIP_CLANG_CXX_COMPILER_VERSION_OUTPUT MATCHES "InstalledDir:[ \t]*([^\n]*)")
get_filename_component(HIP_CLANG_ROOT "${CMAKE_MATCH_1}" DIRECTORY)
endif()
elseif (HIP_CXX_COMPILER MATCHES ".*clang\\+\\+")
get_filename_component(HIP_CLANG_ROOT "${HIP_CXX_COMPILER}" DIRECTORY)
get_filename_component(HIP_CLANG_ROOT "${HIP_CLANG_ROOT}" DIRECTORY)
endif()
file(GLOB HIP_CLANG_INCLUDE_SEARCH_PATHS ${HIP_CLANG_ROOT}/lib/clang/*/include)
find_path(HIP_CLANG_INCLUDE_PATH stddef.h
HINTS
${HIP_CLANG_INCLUDE_SEARCH_PATHS}
NO_DEFAULT_PATH)
if(NOT WIN32)
find_dependency(AMDDeviceLibs)
endif()
set(AMDGPU_TARGETS "gfx906;gfx926;gfx928;gfx936;gfx938" CACHE STRING "DCU targets to compile for")
set(GPU_TARGETS "${AMDGPU_TARGETS}" CACHE STRING "GPU targets to compile for")
endif()
if(NOT WIN32)
find_dependency(amd_comgr)
endif()
include( "${CMAKE_CURRENT_LIST_DIR}/hip-targets.cmake" )
#Using find_dependency to locate the dependency for the packages
#This makes the cmake generated file xxxx-targets to supply the linker libraries
# without worrying other transitive dependencies
if(NOT WIN32)
find_dependency(hsa-runtime64 HINTS /opt/hyhal)
find_dependency(Threads)
endif()
#get_filename_component cannot resolve the symlinks if called from /opt/rocm/lib/hip
#and do three level up again
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_DIR}" REALPATH)
get_filename_component(_IMPORT_PREFIX "${_DIR}/../../../" REALPATH)
# Windows doesn't need HSA
if(NOT WIN32)
#if HSA is not under ROCm then provide CMAKE_PREFIX_PATH=<HSA_PATH>
find_path(HSA_HEADER hsa/hsa.h
PATHS
"${_IMPORT_PREFIX}/../include"
/opt/rocm/include
/opt/hyhal/include
)
if (HSA_HEADER-NOTFOUND)
message (FATAL_ERROR "HSA header not found! ROCM_PATH environment not set")
endif()
endif()
# Right now this is only supported for amd platforms
set_target_properties(hip::host PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "__HIP_PLATFORM_HCC__=1;__HIP_PLATFORM_AMD__=1"
)
if(HIP_RUNTIME MATCHES "rocclr")
set_target_properties(hip::galaxyhip PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "__HIP_ROCclr__=1"
# INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
# INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
)
set_target_properties(hip::device PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "__HIP_ROCclr__=1"
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/../include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/../include"
)
else()
set_target_properties(hip::hip_hcc_static PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}")
set_target_properties(hip::hip_hcc PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
)
set_target_properties(hip::device PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/../include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/../include"
)
endif()
if(HIP_COMPILER STREQUAL "clang")
get_property(compilePropIsSet TARGET hip::device PROPERTY INTERFACE_COMPILE_OPTIONS SET)
execute_process(COMMAND ${ROCM_PATH}/llvm/bin/clang --version
OUTPUT_VARIABLE CLANG_VERSION_RESULT)
string(REGEX MATCH "[0-9]+[.][0-9]+[.][0-9]+" CLANG_VERSION ${CLANG_VERSION_RESULT})
if(${CLANG_VERSION} STREQUAL "15.0.0")
message(DEBUG "clang_version is ${CLANG_VERSION}")
if (NOT compilePropIsSet AND HIP_CXX_COMPILER MATCHES ".*clang\\+\\+")
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS -mllvm -amdgpu-early-inline-all=true -mllvm -amdgpu-function-calls=false
)
endif()
else()
message(DEBUG "clang_version is ${CLANG_VERSION}")
if (NOT compilePropIsSet AND HIP_CXX_COMPILER MATCHES ".*clang\\+\\+")
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS
"SHELL:-mllvm -amdgpu-early-inline-all=true"
"SHELL:-mllvm -amdgpu-function-calls=false"
)
endif()
if(NOT compilePropIsSet)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS -xhip
)
endif()
endif()
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES --hip-link
)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES "${HIP_CLANG_INCLUDE_PATH}/.."
)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${HIP_CLANG_INCLUDE_PATH}/.."
)
foreach(GPU_TARGET ${GPU_TARGETS})
if (NOT compilePropIsSet)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS "--offload-arch=${GPU_TARGET}"
)
endif()
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "--offload-arch=${GPU_TARGET}"
)
endforeach()
#Add support for parallel build and link
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
check_cxx_compiler_flag("-parallel-jobs=1" HIP_CLANG_SUPPORTS_PARALLEL_JOBS)
endif()
if(HIP_CLANG_NUM_PARALLEL_JOBS GREATER 1)
if(${HIP_CLANG_SUPPORTS_PARALLEL_JOBS} )
if (NOT compilePropIsSet)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS -parallel-jobs=${HIP_CLANG_NUM_PARALLEL_JOBS} -Wno-format-nonliteral
)
endif()
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES -parallel-jobs=${HIP_CLANG_NUM_PARALLEL_JOBS}
)
else()
message("clang compiler doesn't support parallel jobs")
endif()
endif()
# Add support for __fp16 and _Float16, explicitly link with compiler-rt
execute_process(COMMAND uname -m
COMMAND tr -d '\n'
RESULT_VARIABLE result_var
OUTPUT_VARIABLE architecture)
message(DEBUG "System architecture is ${architecture}")
if((${architecture} STREQUAL "arm64") OR (${architecture} STREQUAL "aarch64"))
set_property(TARGET hip::host APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "-L\"${HIP_CLANG_INCLUDE_PATH}/../lib/linux\""
)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "-L\"${HIP_CLANG_INCLUDE_PATH}/../lib/linux\""
)
else()
set_property(TARGET hip::host APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "-L\"${HIP_CLANG_INCLUDE_PATH}/../lib/linux\" -lclang_rt.builtins-x86_64"
)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "-L\"${HIP_CLANG_INCLUDE_PATH}/../lib/linux\" -lclang_rt.builtins-x86_64"
)
endif()
endif()
set( hip_LIBRARIES hip::host hip::device)
set( hip_LIBRARY ${hip_LIBRARIES})
set(HIP_INCLUDE_DIR ${hip_INCLUDE_DIR})
set(HIP_INCLUDE_DIRS ${hip_INCLUDE_DIRS})
set(HIP_LIB_INSTALL_DIR ${hip_LIB_INSTALL_DIR})
set(HIP_BIN_INSTALL_DIR ${hip_BIN_INSTALL_DIR})
set(HIP_LIBRARIES ${hip_LIBRARIES})
set(HIP_LIBRARY ${hip_LIBRARY})
set(HIP_HIPCC_EXECUTABLE ${hip_HIPCC_EXECUTABLE})
set(HIP_HIPCONFIG_EXECUTABLE ${hip_HIPCONFIG_EXECUTABLE})
####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
####### Any changes to this file will be overwritten by the next CMake run ####
####### The input file was hip-config.cmake.in ########
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
macro(set_and_check _var _file)
set(${_var} "${_file}")
if(NOT EXISTS "${_file}")
message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
endif()
endmacro()
macro(check_required_components _NAME)
foreach(comp ${${_NAME}_FIND_COMPONENTS})
if(NOT ${_NAME}_${comp}_FOUND)
if(${_NAME}_FIND_REQUIRED_${comp})
set(${_NAME}_FOUND FALSE)
endif()
endif()
endforeach()
endmacro()
####################################################################################
include(CheckCXXCompilerFlag)
include(CMakeFindDependencyMacro OPTIONAL RESULT_VARIABLE _CMakeFindDependencyMacro_FOUND)
if (NOT _CMakeFindDependencyMacro_FOUND)
macro(find_dependency dep)
if (NOT ${dep}_FOUND)
set(cmake_fd_version)
if (${ARGC} GREATER 1)
set(cmake_fd_version ${ARGV1})
endif()
set(cmake_fd_exact_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION_EXACT)
set(cmake_fd_exact_arg EXACT)
endif()
set(cmake_fd_quiet_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
set(cmake_fd_quiet_arg QUIET)
endif()
set(cmake_fd_required_arg)
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
set(cmake_fd_required_arg REQUIRED)
endif()
find_package(${dep} ${cmake_fd_version}
${cmake_fd_exact_arg}
${cmake_fd_quiet_arg}
${cmake_fd_required_arg}
)
string(TOUPPER ${dep} cmake_dep_upper)
if (NOT ${dep}_FOUND AND NOT ${cmake_dep_upper}_FOUND)
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE "${CMAKE_FIND_PACKAGE_NAME} could not be found because dependency ${dep} could not be found.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND False)
return()
endif()
set(cmake_fd_version)
set(cmake_fd_required_arg)
set(cmake_fd_quiet_arg)
set(cmake_fd_exact_arg)
endif()
endmacro()
endif()
#Number of parallel jobs by default is 1
if(NOT DEFINED HIP_CLANG_NUM_PARALLEL_JOBS)
set(HIP_CLANG_NUM_PARALLEL_JOBS 1)
endif()
set(HIP_COMPILER "clang")
set(HIP_RUNTIME "rocclr")
set_and_check( hip_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include" )
set_and_check( hip_INCLUDE_DIRS "${hip_INCLUDE_DIR}" )
set_and_check( hip_LIB_INSTALL_DIR "${PACKAGE_PREFIX_DIR}/lib" )
set_and_check( hip_BIN_INSTALL_DIR "${PACKAGE_PREFIX_DIR}/bin" )
set_and_check(hip_HIPCC_EXECUTABLE "${hip_BIN_INSTALL_DIR}/hipcc")
set_and_check(hip_HIPCONFIG_EXECUTABLE "${hip_BIN_INSTALL_DIR}/hipconfig")
# Windows Specific Definition here:
if(WIN32)
if(DEFINED ENV{HIP_PATH})
set(HIP_PATH "$ENV{HIP_PATH}")
elseif(DEFINED ENV{HIP_DIR})
set(HIP_PATH "$ENV{HIP_DIR}")
else()
set(HIP_PATH "C:/Program Files/AMD HIP SDK/hip")
endif()
else()
# Linux - set a default path for ROCM_PATH
if(NOT DEFINED ROCM_PATH)
set(ROCM_PATH /opt/rocm)
endif()
#If HIP is not installed under ROCm, need this to find HSA assuming HSA is under ROCm
if(DEFINED ENV{ROCM_PATH})
set(ROCM_PATH "$ENV{ROCM_PATH}")
endif()
endif()
if(HIP_COMPILER STREQUAL "clang")
set(HIP_CLANG_ROOT_CANDIDATES)
if(WIN32)
set(HIP_CLANG_ROOT "${HIP_PATH}")
else()
set(HIP_CLANG_ROOT "${ROCM_PATH}/llvm")
endif()
list(APPEND HIP_CLANG_ROOT_CANDIDATES "${HIP_CLANG_ROOT}")
if(NOT WIN32)
list(APPEND HIP_CLANG_ROOT_CANDIDATES "${PACKAGE_PREFIX_DIR}/../llvm")
endif()
if(NOT HIP_CXX_COMPILER)
set(HIP_CXX_COMPILER ${CMAKE_CXX_COMPILER})
endif()
if(HIP_CXX_COMPILER MATCHES ".*hipcc")
execute_process(COMMAND ${HIP_CXX_COMPILER} --version
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE HIP_CLANG_CXX_COMPILER_VERSION_OUTPUT)
if(HIP_CLANG_CXX_COMPILER_VERSION_OUTPUT MATCHES "InstalledDir:[ \t]*([^\n]*)")
get_filename_component(HIP_CLANG_ROOT "${CMAKE_MATCH_1}" DIRECTORY)
list(PREPEND HIP_CLANG_ROOT_CANDIDATES "${HIP_CLANG_ROOT}")
endif()
elseif (HIP_CXX_COMPILER MATCHES ".*clang\\+\\+")
get_filename_component(HIP_CLANG_ROOT "${HIP_CXX_COMPILER}" DIRECTORY)
get_filename_component(HIP_CLANG_ROOT "${HIP_CLANG_ROOT}" DIRECTORY)
list(PREPEND HIP_CLANG_ROOT_CANDIDATES "${HIP_CLANG_ROOT}")
endif()
set(HIP_CLANG_INCLUDE_SEARCH_PATHS)
foreach(_HIP_CLANG_ROOT ${HIP_CLANG_ROOT_CANDIDATES})
file(GLOB _HIP_CLANG_INCLUDE_SEARCH_PATHS ${_HIP_CLANG_ROOT}/lib/clang/*/include)
list(APPEND HIP_CLANG_INCLUDE_SEARCH_PATHS ${_HIP_CLANG_INCLUDE_SEARCH_PATHS})
endforeach()
find_path(HIP_CLANG_INCLUDE_PATH stddef.h
HINTS
${HIP_CLANG_INCLUDE_SEARCH_PATHS}
NO_DEFAULT_PATH)
if(NOT HIP_CLANG_INCLUDE_PATH)
message(FATAL_ERROR
"Could not find HIP clang resource include directory. Checked: "
"${HIP_CLANG_INCLUDE_SEARCH_PATHS}")
endif()
if(NOT WIN32)
find_dependency(AMDDeviceLibs)
endif()
set(AMDGPU_TARGETS "gfx936" CACHE STRING "DCU targets to compile for")
set(GPU_TARGETS "${AMDGPU_TARGETS}" CACHE STRING "GPU targets to compile for")
endif()
if(NOT WIN32)
find_dependency(amd_comgr)
endif()
include( "${CMAKE_CURRENT_LIST_DIR}/hip-targets.cmake" )
#Using find_dependency to locate the dependency for the packages
#This makes the cmake generated file xxxx-targets to supply the linker libraries
# without worrying other transitive dependencies
if(NOT WIN32)
find_dependency(hsa-runtime64 HINTS /opt/hyhal)
find_dependency(Threads)
endif()
#get_filename_component cannot resolve the symlinks if called from /opt/rocm/lib/hip
#and do three level up again
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_DIR}" REALPATH)
get_filename_component(_IMPORT_PREFIX "${_DIR}/../../../" REALPATH)
# Windows doesn't need HSA
if(NOT WIN32)
#if HSA is not under ROCm then provide CMAKE_PREFIX_PATH=<HSA_PATH>
find_path(HSA_HEADER hsa/hsa.h
PATHS
"${_IMPORT_PREFIX}/../include"
/opt/rocm/include
/opt/hyhal/include
)
if (HSA_HEADER-NOTFOUND)
message (FATAL_ERROR "HSA header not found! ROCM_PATH environment not set")
endif()
endif()
# Right now this is only supported for amd platforms
set_target_properties(hip::host PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "__HIP_PLATFORM_HCC__=1;__HIP_PLATFORM_AMD__=1"
)
if(HIP_RUNTIME MATCHES "rocclr")
set_target_properties(hip::galaxyhip PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "__HIP_ROCclr__=1"
# INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
# INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
)
set_target_properties(hip::device PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "__HIP_ROCclr__=1"
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/../include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/../include"
)
else()
set_target_properties(hip::hip_hcc_static PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}")
set_target_properties(hip::hip_hcc PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${HSA_HEADER}"
)
set_target_properties(hip::device PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/../include"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/../include"
)
endif()
if(HIP_COMPILER STREQUAL "clang")
get_property(compilePropIsSet TARGET hip::device PROPERTY INTERFACE_COMPILE_OPTIONS SET)
execute_process(COMMAND ${ROCM_PATH}/llvm/bin/clang --version
OUTPUT_VARIABLE CLANG_VERSION_RESULT)
string(REGEX MATCH "[0-9]+[.][0-9]+[.][0-9]+" CLANG_VERSION ${CLANG_VERSION_RESULT})
if(${CLANG_VERSION} STREQUAL "15.0.0")
message(DEBUG "clang_version is ${CLANG_VERSION}")
if (NOT compilePropIsSet AND HIP_CXX_COMPILER MATCHES ".*clang\\+\\+")
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS -mllvm -amdgpu-early-inline-all=true -mllvm -amdgpu-function-calls=false
)
endif()
else()
message(DEBUG "clang_version is ${CLANG_VERSION}")
if (NOT compilePropIsSet AND HIP_CXX_COMPILER MATCHES ".*clang\\+\\+")
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS
"SHELL:-mllvm -amdgpu-early-inline-all=true"
"SHELL:-mllvm -amdgpu-function-calls=false"
)
endif()
if(NOT compilePropIsSet)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS
"$<$<COMPILE_LANGUAGE:CXX>:-xhip>"
"$<$<COMPILE_LANGUAGE:HIP>:-xhip>"
)
endif()
endif()
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES --hip-link
)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES "${HIP_CLANG_INCLUDE_PATH}/.."
)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${HIP_CLANG_INCLUDE_PATH}/.."
)
foreach(GPU_TARGET ${GPU_TARGETS})
if (NOT compilePropIsSet)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS
"$<$<COMPILE_LANGUAGE:CXX>:--offload-arch=${GPU_TARGET}>"
"$<$<COMPILE_LANGUAGE:HIP>:--offload-arch=${GPU_TARGET}>"
)
endif()
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "--offload-arch=${GPU_TARGET}"
)
endforeach()
#Add support for parallel build and link
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
check_cxx_compiler_flag("-parallel-jobs=1" HIP_CLANG_SUPPORTS_PARALLEL_JOBS)
endif()
if(HIP_CLANG_NUM_PARALLEL_JOBS GREATER 1)
if(${HIP_CLANG_SUPPORTS_PARALLEL_JOBS} )
if (NOT compilePropIsSet)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_COMPILE_OPTIONS -parallel-jobs=${HIP_CLANG_NUM_PARALLEL_JOBS} -Wno-format-nonliteral
)
endif()
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES -parallel-jobs=${HIP_CLANG_NUM_PARALLEL_JOBS}
)
else()
message("clang compiler doesn't support parallel jobs")
endif()
endif()
# Add support for __fp16 and _Float16, explicitly link with compiler-rt
execute_process(COMMAND uname -m
COMMAND tr -d '\n'
RESULT_VARIABLE result_var
OUTPUT_VARIABLE architecture)
message(DEBUG "System architecture is ${architecture}")
if((${architecture} STREQUAL "arm64") OR (${architecture} STREQUAL "aarch64"))
set_property(TARGET hip::host APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "-L\"${HIP_CLANG_INCLUDE_PATH}/../lib/linux\""
)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "-L\"${HIP_CLANG_INCLUDE_PATH}/../lib/linux\""
)
else()
set_property(TARGET hip::host APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "-L\"${HIP_CLANG_INCLUDE_PATH}/../lib/linux\" -lclang_rt.builtins-x86_64"
)
set_property(TARGET hip::device APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "-L\"${HIP_CLANG_INCLUDE_PATH}/../lib/linux\" -lclang_rt.builtins-x86_64"
)
endif()
endif()
set( hip_LIBRARIES hip::host hip::device)
set( hip_LIBRARY ${hip_LIBRARIES})
set(HIP_INCLUDE_DIR ${hip_INCLUDE_DIR})
set(HIP_INCLUDE_DIRS ${hip_INCLUDE_DIRS})
set(HIP_LIB_INSTALL_DIR ${hip_LIB_INSTALL_DIR})
set(HIP_BIN_INSTALL_DIR ${hip_BIN_INSTALL_DIR})
set(HIP_LIBRARIES ${hip_LIBRARIES})
set(HIP_LIBRARY ${hip_LIBRARY})
set(HIP_HIPCC_EXECUTABLE ${hip_HIPCC_EXECUTABLE})
set(HIP_HIPCONFIG_EXECUTABLE ${hip_HIPCONFIG_EXECUTABLE})
#!/usr/bin/env bash
set -euo pipefail
DTK_HOME=${DTK_HOME:-/opt/dtk}
backup_suffix=$(date +%Y%m%d-%H%M%S)
overlay_files=(
"hip/lib/cmake/hip/hip-config.cmake 0644"
"hip/lib/cmake/hip/hip-config-amd.cmake 0644"
"hip/lib/cmake/hip/hip-config-nvidia.cmake 0644"
)
derived_files=(
"tools/dtk-amdclang-wrapper llvm/bin/amdclang 0755"
"tools/dtk-amdclang-wrapper llvm/bin/amdclang++ 0755"
)
backup_and_remove() {
local dst=$1
if [ -e "$dst" ] || [ -L "$dst" ]; then
cp -a "$dst" "$dst.bak.$backup_suffix"
rm -f "$dst"
fi
}
for item in "${overlay_files[@]}"; do
rel=${item% *}
mode=${item##* }
src="./$rel"
dst="$DTK_HOME/$rel"
if [ ! -f "$src" ]; then
echo "missing source: $src" >&2
exit 1
fi
backup_and_remove "$dst"
install -D -m "$mode" "$src" "$dst"
echo "installed $src -> $dst mode=$mode"
done
for item in "${derived_files[@]}"; do
read -r src_rel dst_rel mode <<< "$item"
src="./$src_rel"
dst="$DTK_HOME/$dst_rel"
if [ ! -f "$src" ]; then
echo "missing source: $src" >&2
exit 1
fi
backup_and_remove "$dst"
install -D -m "$mode" "$src" "$dst"
echo "installed $src -> $dst mode=$mode"
done
#!/usr/bin/env bash
set -euo pipefail
real_compiler="${DTK_AMDCLANG_REAL:-/opt/dtk/llvm/bin/dcc}"
bad_gcc_toolchain="${DTK_BAD_GCC_TOOLCHAIN:-/opt/dtk/llvm}"
fixed_gcc_toolchain="${DTK_GCC_TOOLCHAIN:-/usr}"
args=()
while (($#)); do
case "$1" in
--gcc-toolchain="$bad_gcc_toolchain")
args+=("--gcc-toolchain=$fixed_gcc_toolchain")
shift
;;
--gcc-toolchain)
if (($# >= 2)) && [[ "$2" == "$bad_gcc_toolchain" ]]; then
args+=("--gcc-toolchain" "$fixed_gcc_toolchain")
shift 2
else
args+=("$1")
shift
if (($#)); then
args+=("$1")
shift
fi
fi
;;
*)
args+=("$1")
shift
;;
esac
done
exec "$real_compiler" "${args[@]}"
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment