From 0f17e51ee72eb64b90e58723ef03077277fd605f Mon Sep 17 00:00:00 2001 From: Marcel Koch Date: Thu, 29 Aug 2024 09:51:02 +0200 Subject: [PATCH 1/5] [cmake] remove maipulation of HIP|ROCM_PATH --- CMakeLists.txt | 1 - cmake/hip.cmake | 94 +++++--------------------------------------- cmake/hip_path.cmake | 13 ------ 3 files changed, 9 insertions(+), 99 deletions(-) delete mode 100644 cmake/hip_path.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 10f76ac9a6c..59131fac4f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,6 @@ set(PROJECT_VERSION_TAG ${Ginkgo_VERSION_TAG}) set(THREADS_PREFER_PTHREAD_FLAG ON) # Determine which modules can be compiled -include(cmake/hip_path.cmake) include(cmake/autodetect_executors.cmake) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules/") diff --git a/cmake/hip.cmake b/cmake/hip.cmake index bd834c3ebde..52f377ad6ca 100644 --- a/cmake/hip.cmake +++ b/cmake/hip.cmake @@ -1,5 +1,10 @@ cmake_minimum_required(VERSION 3.21 FATAL_ERROR) enable_language(HIP) + +# We keep using NVCC/HCC for consistency with previous releases even if AMD +# updated everything to use NVIDIA/AMD in ROCM 4.1 +set(GINKGO_HIP_PLATFORM_NVCC 0) +set(GINKGO_HIP_PLATFORM_HCC 0) if(CMAKE_HIP_COMPILER_ID STREQUAL "NVIDIA") set(GINKGO_HIP_PLATFORM "nvidia") set(GINKGO_HIP_PLATFORM_NVIDIA ON) @@ -12,73 +17,6 @@ else() set(GINKGO_HIP_PLATFORM_HCC 1) 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") - elseif(DEFINED ENV{HIP_PATH}) - set(ROCM_PATH "$ENV{HIP_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() - -if(NOT DEFINED HIPBLAS_PATH) - if(DEFINED ENV{HIPBLAS_PATH}) - set(HIPBLAS_PATH $ENV{HIPBLAS_PATH} CACHE PATH "Path to which HIPBLAS has been installed") - else() - set(HIPBLAS_PATH "${ROCM_PATH}/hipblas" CACHE PATH "Path to which HIPBLAS has been installed") - endif() -endif() - -if(NOT DEFINED HIPFFT_PATH) - if(DEFINED ENV{HIPFFT_PATH}) - set(HIPFFT_PATH $ENV{HIPFFT_PATH} CACHE PATH "Path to which HIPFFT has been installed") - else() - set(HIPFFT_PATH "${ROCM_PATH}/hipfft" CACHE PATH "Path to which HIPFFT has been installed") - endif() -endif() - -if(NOT DEFINED HIPRAND_PATH) - if(DEFINED ENV{HIPRAND_PATH}) - set(HIPRAND_PATH $ENV{HIPRAND_PATH} CACHE PATH "Path to which HIPRAND has been installed") - else() - set(HIPRAND_PATH "${ROCM_PATH}/hiprand" CACHE PATH "Path to which HIPRAND has been installed") - endif() -endif() - -if(NOT DEFINED ROCRAND_PATH) - if(DEFINED ENV{ROCRAND_PATH}) - set(ROCRAND_PATH $ENV{ROCRAND_PATH} CACHE PATH "Path to which ROCRAND has been installed") - else() - set(ROCRAND_PATH "${ROCM_PATH}/rocrand" CACHE PATH "Path to which ROCRAND has been installed") - endif() -endif() - -if(NOT DEFINED HIPSPARSE_PATH) - if(DEFINED ENV{HIPSPARSE_PATH}) - set(HIPSPARSE_PATH $ENV{HIPSPARSE_PATH} CACHE PATH "Path to which HIPSPARSE has been installed") - else() - set(HIPSPARSE_PATH "${ROCM_PATH}/hipsparse" CACHE PATH "Path to which HIPSPARSE has been installed") - endif() -endif() - -if(NOT DEFINED HIP_CLANG_PATH) - if(NOT DEFINED ENV{HIP_CLANG_PATH}) - set(HIP_CLANG_PATH "${ROCM_PATH}/llvm/bin" CACHE PATH "Path to which HIP compatible clang binaries have been installed") - else() - set(HIP_CLANG_PATH $ENV{HIP_CLANG_PATH} CACHE PATH "Path to which HIP compatible clang binaries have been installed") - endif() -endif() - -if(NOT DEFINED ROCTRACER_PATH) - if(DEFINED ENV{ROCTRACER_PATH}) - set(ROCTRACER_PATH $ENV{ROCTRACER_PATH} CACHE PATH "Path to which ROCTRACER has been installed") - else() - set(ROCTRACER_PATH "${ROCM_PATH}/roctracer" CACHE PATH "Path to which ROCTRACER has been installed") - endif() -endif() - find_program( HIP_HIPCONFIG_EXECUTABLE NAMES hipconfig @@ -97,24 +35,10 @@ if(NOT HIP_HIPCONFIG_EXECUTABLE) endif() execute_process( - COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --version - OUTPUT_VARIABLE GINKGO_HIP_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_STRIP_TRAILING_WHITESPACE - ) - -## Setup all CMAKE variables to find HIP and its dependencies -set(GINKGO_HIP_MODULE_PATH "${HIP_PATH}/cmake") -list(APPEND CMAKE_MODULE_PATH "${GINKGO_HIP_MODULE_PATH}") -if (GINKGO_HIP_PLATFORM_AND) - list(APPEND CMAKE_PREFIX_PATH "${HIP_PATH}/lib/cmake") -endif() -list(APPEND CMAKE_PREFIX_PATH - "${HIPBLAS_PATH}/lib/cmake" - "${HIPFFT_PATH}/lib/cmake" - "${HIPRAND_PATH}/lib/cmake" - "${HIPSPARSE_PATH}/lib/cmake" - "${ROCRAND_PATH}/lib/cmake" + COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --version + OUTPUT_VARIABLE GINKGO_HIP_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE ) find_package(hipblas REQUIRED) diff --git a/cmake/hip_path.cmake b/cmake/hip_path.cmake deleted file mode 100644 index a9f418cb3bd..00000000000 --- a/cmake/hip_path.cmake +++ /dev/null @@ -1,13 +0,0 @@ -if(NOT DEFINED HIP_PATH) - if(NOT DEFINED ENV{HIP_PATH}) - set(HIP_PATH "/opt/rocm/hip" CACHE PATH "Path to which HIP has been installed") - set(ENV{HIP_PATH} ${HIP_PATH}) - else() - set(HIP_PATH $ENV{HIP_PATH} CACHE PATH "Path to which HIP has been installed") - endif() -endif() - -# We keep using NVCC/HCC for consistency with previous releases even if AMD -# updated everything to use NVIDIA/AMD in ROCM 4.1 -set(GINKGO_HIP_PLATFORM_NVCC 0) -set(GINKGO_HIP_PLATFORM_HCC 0) From cc768a5d5b3510d8f6a167444ca0aa6e4c19dbda Mon Sep 17 00:00:00 2001 From: Marcel Koch Date: Thu, 29 Aug 2024 09:52:13 +0200 Subject: [PATCH 2/5] [cmake] warn on faulty rocm CMake setup --- cmake/autodetect_executors.cmake | 3 +++ cmake/hip.cmake | 30 ++++++---------------- cmake/hip_helpers.cmake | 43 ++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 23 deletions(-) create mode 100644 cmake/hip_helpers.cmake diff --git a/cmake/autodetect_executors.cmake b/cmake/autodetect_executors.cmake index d3ad2e3a6a1..656e5096fc1 100644 --- a/cmake/autodetect_executors.cmake +++ b/cmake/autodetect_executors.cmake @@ -35,6 +35,9 @@ if (NOT DEFINED GINKGO_BUILD_HIP) if(CMAKE_HIP_COMPILER) message(STATUS "Enabling HIP executor") set(GINKGO_HAS_HIP ON) + else () + include(cmake/hip_helpers.cmake) + ginkgo_check_hip_detection_issue() endif() endif() diff --git a/cmake/hip.cmake b/cmake/hip.cmake index 52f377ad6ca..6a05933377f 100644 --- a/cmake/hip.cmake +++ b/cmake/hip.cmake @@ -1,4 +1,10 @@ cmake_minimum_required(VERSION 3.21 FATAL_ERROR) + +include(cmake/hip_helpers.cmake) +include(CheckLanguage) +check_language(HIP) +ginkgo_check_hip_detection_issue() + enable_language(HIP) # We keep using NVCC/HCC for consistency with previous releases even if AMD @@ -17,29 +23,7 @@ else() set(GINKGO_HIP_PLATFORM_HCC 1) endif() -find_program( - HIP_HIPCONFIG_EXECUTABLE - NAMES hipconfig - PATHS - "${HIP_ROOT_DIR}" - ENV ROCM_PATH - ENV HIP_PATH - /opt/rocm - /opt/rocm/hip - PATH_SUFFIXES bin - NO_DEFAULT_PATH -) -if(NOT HIP_HIPCONFIG_EXECUTABLE) - # Now search in default paths - find_program(HIP_HIPCONFIG_EXECUTABLE hipconfig) -endif() - -execute_process( - COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --version - OUTPUT_VARIABLE GINKGO_HIP_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_STRIP_TRAILING_WHITESPACE -) +ginkgo_find_hip_version() find_package(hipblas REQUIRED) find_package(hipfft) # optional dependency diff --git a/cmake/hip_helpers.cmake b/cmake/hip_helpers.cmake new file mode 100644 index 00000000000..cf9062bde41 --- /dev/null +++ b/cmake/hip_helpers.cmake @@ -0,0 +1,43 @@ +function(ginkgo_find_hip_version) + find_program( + HIP_HIPCONFIG_EXECUTABLE + NAMES hipconfig + PATHS + "${HIP_ROOT_DIR}" + ENV ROCM_PATH + ENV HIP_PATH + /opt/rocm + /opt/rocm/hip + PATH_SUFFIXES bin + NO_DEFAULT_PATH + ) + if(NOT HIP_HIPCONFIG_EXECUTABLE) + # Now search in default paths + find_program(HIP_HIPCONFIG_EXECUTABLE hipconfig) + endif() + + execute_process( + COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --version + OUTPUT_VARIABLE GINKGO_HIP_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + set(GINKGO_HIP_VERSION ${GINKGO_HIP_VERSION} PARENT_SCOPE) +endfunction() + +# This function checks if ROCm might not be detected correctly. +# ROCm < 5.7 has a faulty CMake setup that requires setting +# CMAKE_PREFIX_PATH=$ROCM_PATH/lib/cmake, otherwise HIP will not be detected. +function(ginkgo_check_hip_detection_issue) + if(NOT CMAKE_HIP_COMPILER) + ginkgo_find_hip_version() + if (GINKGO_HIP_VERSION AND GINKGO_HIP_VERSION VERSION_LESS 5.7) + message(WARNING + "Could not find a HIP compiler, but HIP version ${GINKGO_HIP_VERSION} was detected through " + "hipconfig. Try setting the environment variable CMAKE_PREFIX_PATH=$ROCM_PATH/lib/cmake, or " + "update to ROCm >= 5.7." + ) + endif () + endif () +endfunction() + From 43a371bb2be8918ff5a0a7845c63a240f725e0d6 Mon Sep 17 00:00:00 2001 From: Marcel Koch Date: Thu, 29 Aug 2024 10:33:45 +0200 Subject: [PATCH 3/5] [cmake] use cmakedefine01 for hip platform --- include/ginkgo/config.hpp.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/ginkgo/config.hpp.in b/include/ginkgo/config.hpp.in index 329918399d6..1dfa6bc61bc 100644 --- a/include/ginkgo/config.hpp.in +++ b/include/ginkgo/config.hpp.in @@ -41,10 +41,10 @@ /* What is HIP compiled for, hcc or nvcc? */ // clang-format off -#define GINKGO_HIP_PLATFORM_HCC @GINKGO_HIP_PLATFORM_HCC@ +#cmakedefine01 GINKGO_HIP_PLATFORM_HCC -#define GINKGO_HIP_PLATFORM_NVCC @GINKGO_HIP_PLATFORM_NVCC@ +#cmakedefine01 GINKGO_HIP_PLATFORM_NVCC // clang-format on From 7ad728156cfea98f3f49fb5813db4ebe2893bdb5 Mon Sep 17 00:00:00 2001 From: Marcel Koch Date: Tue, 15 Oct 2024 06:34:51 +0000 Subject: [PATCH 4/5] fixup! [cmake] remove maipulation of HIP|ROCM_PATH --- cmake/GinkgoConfig.cmake.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmake/GinkgoConfig.cmake.in b/cmake/GinkgoConfig.cmake.in index 1f12251f93d..a5ead102c23 100644 --- a/cmake/GinkgoConfig.cmake.in +++ b/cmake/GinkgoConfig.cmake.in @@ -135,7 +135,7 @@ set(GINKGO_HAVE_VTUNE "@GINKGO_HAVE_VTUNE@") set(GINKGO_HAVE_METIS "@GINKGO_HAVE_METIS@") set_and_check(VTune_PATH "@VTune_PATH@") -# ensure Threads settings +# ensure Threads settings set(THREADS_PREFER_PTHREAD_FLAG ON) # NOTE: we do not export benchmarks, examples, tests or devel tools @@ -176,7 +176,6 @@ if((NOT GINKGO_BUILD_SHARED_LIBS) AND GINKGO_BUILD_HIP) find_dependency(hipsparse) find_dependency(rocrand) find_dependency(rocthrust) - set_and_check(ROCTRACER_PATH "@ROCTRACER_PATH@") find_dependency(ROCTX) endif() From f6eb48aedab70653882ae863d4738c20364d1476 Mon Sep 17 00:00:00 2001 From: Marcel Koch Date: Tue, 15 Oct 2024 07:32:31 +0000 Subject: [PATCH 5/5] [cmake] use ROCM_PATH for finding roctx --- cmake/Modules/FindROCTX.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/FindROCTX.cmake b/cmake/Modules/FindROCTX.cmake index e5647080ca3..1bcb344c6d9 100644 --- a/cmake/Modules/FindROCTX.cmake +++ b/cmake/Modules/FindROCTX.cmake @@ -26,11 +26,11 @@ # ``ROCTX_FOUND`` # If false, do not try to use the ROCTX library. -find_path(ROCTX_INCLUDE_DIR NAMES roctx.h HINTS ${ROCTRACER_PATH}/include) +find_path(ROCTX_INCLUDE_DIR NAMES roctx.h HINTS ${ROCTRACER_PATH}/include ${ROCM_PATH}/include/roctracer) mark_as_advanced(ROCTX_INCLUDE_DIR) if(NOT ROCTX_LIBRARY) - find_library(ROCTX_LIBRARY NAMES roctx64 HINTS ${ROCTRACER_PATH}/lib) + find_library(ROCTX_LIBRARY NAMES roctx64 HINTS ${ROCTRACER_PATH}/lib ${ROCM_PATH}/lib) endif() include(FindPackageHandleStandardArgs)