|
@@ -15,6 +15,13 @@ if(NOT CMAKE_HIP_COMPILER)
|
|
|
|
|
|
|
|
# prefer the environment variable HIPCXX
|
|
# prefer the environment variable HIPCXX
|
|
|
if(NOT $ENV{HIPCXX} STREQUAL "")
|
|
if(NOT $ENV{HIPCXX} STREQUAL "")
|
|
|
|
|
+ if("$ENV{HIPCXX}" MATCHES "hipcc")
|
|
|
|
|
+ message(FATAL_ERROR
|
|
|
|
|
+ "The HIPCXX environment variable is set to the hipcc wrapper:\n"
|
|
|
|
|
+ " $ENV{HIPCXX}\n"
|
|
|
|
|
+ "This is not supported. Use Clang directly, or let CMake pick a default."
|
|
|
|
|
+ )
|
|
|
|
|
+ endif()
|
|
|
get_filename_component(CMAKE_HIP_COMPILER_INIT $ENV{HIPCXX} PROGRAM PROGRAM_ARGS CMAKE_HIP_FLAGS_ENV_INIT)
|
|
get_filename_component(CMAKE_HIP_COMPILER_INIT $ENV{HIPCXX} PROGRAM PROGRAM_ARGS CMAKE_HIP_FLAGS_ENV_INIT)
|
|
|
if(CMAKE_HIP_FLAGS_ENV_INIT)
|
|
if(CMAKE_HIP_FLAGS_ENV_INIT)
|
|
|
set(CMAKE_HIP_COMPILER_ARG1 "${CMAKE_HIP_FLAGS_ENV_INIT}" CACHE STRING "Arguments to CXX compiler")
|
|
set(CMAKE_HIP_COMPILER_ARG1 "${CMAKE_HIP_FLAGS_ENV_INIT}" CACHE STRING "Arguments to CXX compiler")
|
|
@@ -26,10 +33,25 @@ if(NOT CMAKE_HIP_COMPILER)
|
|
|
|
|
|
|
|
# finally list compilers to try
|
|
# finally list compilers to try
|
|
|
if(NOT CMAKE_HIP_COMPILER_INIT)
|
|
if(NOT CMAKE_HIP_COMPILER_INIT)
|
|
|
- set(CMAKE_HIP_COMPILER_LIST hipcc clang++)
|
|
|
|
|
|
|
+ set(CMAKE_HIP_COMPILER_LIST clang++)
|
|
|
|
|
+
|
|
|
|
|
+ # Look for the Clang coming with ROCm to support HIP.
|
|
|
|
|
+ execute_process(COMMAND hipconfig --hipclangpath
|
|
|
|
|
+ OUTPUT_VARIABLE _CMAKE_HIPCONFIG_CLANGPATH
|
|
|
|
|
+ RESULT_VARIABLE _CMAKE_HIPCONFIG_RESULT
|
|
|
|
|
+ )
|
|
|
|
|
+ if(_CMAKE_HIPCONFIG_RESULT EQUAL 0 AND EXISTS "${_CMAKE_HIPCONFIG_CLANGPATH}")
|
|
|
|
|
+ set(CMAKE_HIP_COMPILER_HINTS "${_CMAKE_HIPCONFIG_CLANGPATH}")
|
|
|
|
|
+ endif()
|
|
|
endif()
|
|
endif()
|
|
|
|
|
|
|
|
_cmake_find_compiler(HIP)
|
|
_cmake_find_compiler(HIP)
|
|
|
|
|
+elseif(CMAKE_HIP_COMPILER MATCHES "hipcc")
|
|
|
|
|
+ message(FATAL_ERROR
|
|
|
|
|
+ "CMAKE_HIP_COMPILER is set to the hipcc wrapper:\n"
|
|
|
|
|
+ " ${CMAKE_HIP_COMPILER}\n"
|
|
|
|
|
+ "This is not supported. Use Clang directly, or let CMake pick a default."
|
|
|
|
|
+ )
|
|
|
else()
|
|
else()
|
|
|
_cmake_find_compiler_path(HIP)
|
|
_cmake_find_compiler_path(HIP)
|
|
|
endif()
|
|
endif()
|
|
@@ -52,7 +74,40 @@ if(NOT CMAKE_HIP_COMPILER_ID_RUN)
|
|
|
CMAKE_DETERMINE_COMPILER_ID(HIP HIPFLAGS CMakeHIPCompilerId.hip)
|
|
CMAKE_DETERMINE_COMPILER_ID(HIP HIPFLAGS CMakeHIPCompilerId.hip)
|
|
|
|
|
|
|
|
_cmake_find_compiler_sysroot(HIP)
|
|
_cmake_find_compiler_sysroot(HIP)
|
|
|
|
|
+endif()
|
|
|
|
|
|
|
|
|
|
+if(NOT CMAKE_HIP_COMPILER_ROCM_ROOT AND CMAKE_HIP_COMPILER_ID STREQUAL "Clang")
|
|
|
|
|
+ execute_process(COMMAND "${CMAKE_HIP_COMPILER}" -v -print-targets
|
|
|
|
|
+ OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
|
+ RESULT_VARIABLE _CMAKE_HIP_COMPILER_RESULT
|
|
|
|
|
+ OUTPUT_VARIABLE _CMAKE_HIP_COMPILER_STDOUT
|
|
|
|
|
+ ERROR_VARIABLE _CMAKE_HIP_COMPILER_STDERR
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ if(_CMAKE_HIP_COMPILER_RESULT EQUAL 0 AND _CMAKE_HIP_COMPILER_STDERR MATCHES "Found HIP installation: *([^,]*)[,\n]")
|
|
|
|
|
+ set(CMAKE_HIP_COMPILER_ROCM_ROOT "${CMAKE_MATCH_1}")
|
|
|
|
|
+ endif()
|
|
|
|
|
+endif()
|
|
|
|
|
+if(NOT CMAKE_HIP_COMPILER_ROCM_ROOT)
|
|
|
|
|
+ execute_process(
|
|
|
|
|
+ COMMAND hipconfig --rocmpath
|
|
|
|
|
+ OUTPUT_VARIABLE _CMAKE_HIPCONFIG_ROCMPATH
|
|
|
|
|
+ RESULT_VARIABLE _CMAKE_HIPCONFIG_RESULT
|
|
|
|
|
+ )
|
|
|
|
|
+ if(_CMAKE_HIPCONFIG_RESULT EQUAL 0 AND EXISTS "${_CMAKE_HIPCONFIG_ROCMPATH}")
|
|
|
|
|
+ set(CMAKE_HIP_COMPILER_ROCM_ROOT "${_CMAKE_HIPCONFIG_ROCMPATH}")
|
|
|
|
|
+ endif()
|
|
|
|
|
+endif()
|
|
|
|
|
+if(NOT CMAKE_HIP_COMPILER_ROCM_ROOT)
|
|
|
|
|
+ message(FATAL_ERROR "Failed to find ROCm root directory.")
|
|
|
|
|
+endif()
|
|
|
|
|
+if(NOT EXISTS "${CMAKE_HIP_COMPILER_ROCM_ROOT}/lib/cmake/hip-lang/hip-lang-config.cmake")
|
|
|
|
|
+ message(FATAL_ERROR
|
|
|
|
|
+ "The ROCm root directory:\n"
|
|
|
|
|
+ " ${CMAKE_HIP_COMPILER_ROCM_ROOT}\n"
|
|
|
|
|
+ "does not contain the HIP runtime CMake package, expected at:\n"
|
|
|
|
|
+ " ${CMAKE_HIP_COMPILER_ROCM_ROOT}/lib/cmake/hip-lang/hip-lang-config.cmake\n"
|
|
|
|
|
+ )
|
|
|
endif()
|
|
endif()
|
|
|
|
|
|
|
|
if (NOT _CMAKE_TOOLCHAIN_LOCATION)
|
|
if (NOT _CMAKE_TOOLCHAIN_LOCATION)
|
|
@@ -85,12 +140,44 @@ if(MSVC_HIP_ARCHITECTURE_ID)
|
|
|
endif()
|
|
endif()
|
|
|
|
|
|
|
|
if(NOT DEFINED CMAKE_HIP_ARCHITECTURES)
|
|
if(NOT DEFINED CMAKE_HIP_ARCHITECTURES)
|
|
|
- # Analyze output from hipcc to get the current GPU architecture.
|
|
|
|
|
- if(CMAKE_HIP_COMPILER_PRODUCED_OUTPUT MATCHES " -target-cpu ([a-z0-9]+) ")
|
|
|
|
|
|
|
+ # Use 'rocm_agent_enumerator' to get the current GPU architecture.
|
|
|
|
|
+ set(_CMAKE_HIP_ARCHITECTURES)
|
|
|
|
|
+ find_program(_CMAKE_HIP_ROCM_AGENT_ENUMERATOR
|
|
|
|
|
+ NAMES rocm_agent_enumerator
|
|
|
|
|
+ HINTS "${CMAKE_HIP_COMPILER_ROCM_ROOT}/bin"
|
|
|
|
|
+ NO_CACHE)
|
|
|
|
|
+ if(_CMAKE_HIP_ROCM_AGENT_ENUMERATOR)
|
|
|
|
|
+ execute_process(COMMAND "${_CMAKE_HIP_ROCM_AGENT_ENUMERATOR}" -t GPU
|
|
|
|
|
+ RESULT_VARIABLE _CMAKE_ROCM_AGENT_ENUMERATOR_RESULT
|
|
|
|
|
+ OUTPUT_VARIABLE _CMAKE_ROCM_AGENT_ENUMERATOR_STDOUT
|
|
|
|
|
+ ERROR_VARIABLE _CMAKE_ROCM_AGENT_ENUMERATOR_STDERR
|
|
|
|
|
+ )
|
|
|
|
|
+ if(_CMAKE_ROCM_AGENT_ENUMERATOR_RESULT EQUAL 0)
|
|
|
|
|
+ separate_arguments(_hip_archs NATIVE_COMMAND "${_CMAKE_ROCM_AGENT_ENUMERATOR_STDOUT}")
|
|
|
|
|
+ foreach(_hip_arch ${_hip_archs})
|
|
|
|
|
+ if(_hip_arch STREQUAL "gfx000")
|
|
|
|
|
+ continue()
|
|
|
|
|
+ endif()
|
|
|
|
|
+ string(FIND ${_hip_arch} ":" pos)
|
|
|
|
|
+ if(NOT pos STREQUAL "-1")
|
|
|
|
|
+ string(SUBSTRING ${_hip_arch} 0 ${pos} _hip_arch)
|
|
|
|
|
+ endif()
|
|
|
|
|
+ list(APPEND _CMAKE_HIP_ARCHITECTURES "${_hip_arch}")
|
|
|
|
|
+ endforeach()
|
|
|
|
|
+ endif()
|
|
|
|
|
+ unset(_CMAKE_ROCM_AGENT_ENUMERATOR_RESULT)
|
|
|
|
|
+ unset(_CMAKE_ROCM_AGENT_ENUMERATOR_STDOUT)
|
|
|
|
|
+ unset(_CMAKE_ROCM_AGENT_ENUMERATOR_STDERR)
|
|
|
|
|
+ endif()
|
|
|
|
|
+ unset(_CMAKE_HIP_ROCM_AGENT_ENUMERATOR)
|
|
|
|
|
+ if(_CMAKE_HIP_ARCHITECTURES)
|
|
|
|
|
+ set(CMAKE_HIP_ARCHITECTURES "${_CMAKE_HIP_ARCHITECTURES}" CACHE STRING "HIP architectures")
|
|
|
|
|
+ elseif(CMAKE_HIP_COMPILER_PRODUCED_OUTPUT MATCHES " -target-cpu ([a-z0-9]+) ")
|
|
|
set(CMAKE_HIP_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "HIP architectures")
|
|
set(CMAKE_HIP_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "HIP architectures")
|
|
|
else()
|
|
else()
|
|
|
- message(FATAL_ERROR "Failed to find a working HIP architecture.")
|
|
|
|
|
|
|
+ message(FATAL_ERROR "Failed to find a default HIP architecture.")
|
|
|
endif()
|
|
endif()
|
|
|
|
|
+ unset(_CMAKE_HIP_ARCHITECTURES)
|
|
|
endif()
|
|
endif()
|
|
|
|
|
|
|
|
# configure variables set in this file for fast reload later on
|
|
# configure variables set in this file for fast reload later on
|