From 9421162eef31f7947419d9ec5362e92cdf025159 Mon Sep 17 00:00:00 2001 From: David Rohr Date: Mon, 26 May 2025 14:10:26 +0200 Subject: [PATCH] GPU RTC: Check that current compiler versions are the same as those used to create RTC code in cache --- GPU/GPUTracking/Base/GPUReconstruction.h | 1 + .../GPUReconstructionAvailableBackends.template.h | 3 +++ GPU/GPUTracking/Base/GPUReconstructionLibrary.cxx | 5 +++++ .../Base/cuda/GPUReconstructionCUDAGenRTC.cxx | 11 ++++++++--- GPU/GPUTracking/CMakeLists.txt | 1 + dependencies/FindO2GPU.cmake | 6 +++--- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/GPU/GPUTracking/Base/GPUReconstruction.h b/GPU/GPUTracking/Base/GPUReconstruction.h index 06f1c27fb6c06..293fc060caa89 100644 --- a/GPU/GPUTracking/Base/GPUReconstruction.h +++ b/GPU/GPUTracking/Base/GPUReconstruction.h @@ -273,6 +273,7 @@ class GPUReconstruction // Private helpers for library loading static std::shared_ptr* GetLibraryInstance(DeviceType type, bool verbose); + static std::string getBackendVersions(); // Private helper functions for memory management size_t AllocateRegisteredMemoryHelper(GPUMemoryResource* res, void*& ptr, void*& memorypool, void* memorybase, size_t memorysize, void* (GPUMemoryResource::*SetPointers)(void*), void*& memorypoolend, const char* device); diff --git a/GPU/GPUTracking/Base/GPUReconstructionAvailableBackends.template.h b/GPU/GPUTracking/Base/GPUReconstructionAvailableBackends.template.h index 35892db121f50..aaf5f23b8d855 100644 --- a/GPU/GPUTracking/Base/GPUReconstructionAvailableBackends.template.h +++ b/GPU/GPUTracking/Base/GPUReconstructionAvailableBackends.template.h @@ -12,6 +12,9 @@ /// \file GPUReconstructionAvailableBackends.h /// \author David Rohr +// clang-format off #cmakedefine CUDA_ENABLED #cmakedefine HIP_ENABLED #cmakedefine OPENCL_ENABLED +#cmakedefine GPUCA_COMPILER_VERSIONS @GPUCA_COMPILER_VERSIONS@ +// clang-format on diff --git a/GPU/GPUTracking/Base/GPUReconstructionLibrary.cxx b/GPU/GPUTracking/Base/GPUReconstructionLibrary.cxx index 64184dd724acd..c70c5d8c51d6f 100644 --- a/GPU/GPUTracking/Base/GPUReconstructionLibrary.cxx +++ b/GPU/GPUTracking/Base/GPUReconstructionLibrary.cxx @@ -184,3 +184,8 @@ int32_t GPUReconstruction::LibraryLoader::CloseLibrary() mGPUEntry = nullptr; return 0; } + +std::string GPUReconstruction::getBackendVersions() +{ + return GPUCA_M_STR(GPUCA_COMPILER_VERSIONS); +} diff --git a/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDAGenRTC.cxx b/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDAGenRTC.cxx index b5a3b1bb919b9..8c3fb92c11c9e 100644 --- a/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDAGenRTC.cxx +++ b/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDAGenRTC.cxx @@ -80,13 +80,16 @@ int32_t GPUReconstructionCUDA::genRTC(std::string& filename, uint32_t& nCompile) GPUInfo("RTC Launch Bounds:\n%s", launchBounds.c_str()); } - char shasource[21], shaparam[21], shacmd[21], shakernels[21], shabounds[21]; + const std::string compilerVersions = getBackendVersions(); + + char shasource[21], shaparam[21], shacmd[21], shakernels[21], shabounds[21], shaversion[21]; if (GetProcessingSettings().rtc.cacheOutput) { o2::framework::internal::SHA1(shasource, _binary_GPUReconstructionCUDArtc_src_start, _binary_GPUReconstructionCUDArtc_src_len); o2::framework::internal::SHA1(shaparam, rtcparam.c_str(), rtcparam.size()); o2::framework::internal::SHA1(shacmd, baseCommand.c_str(), baseCommand.size()); o2::framework::internal::SHA1(shakernels, kernelsall.c_str(), kernelsall.size()); o2::framework::internal::SHA1(shabounds, launchBounds.c_str(), launchBounds.size()); + o2::framework::internal::SHA1(shaversion, compilerVersions.c_str(), compilerVersions.size()); } nCompile = GetProcessingSettings().rtc.compilePerKernel ? kernels.size() : 1; @@ -131,11 +134,12 @@ int32_t GPUReconstructionCUDA::genRTC(std::string& filename, uint32_t& nCompile) } return 0; }; - if (checkSHA(shasource, "source") || // TODO: CHECK VERSION! + if (checkSHA(shasource, "source") || checkSHA(shaparam, "param") || checkSHA(shacmd, "command line") || checkSHA(shakernels, "kernel definitions") || - checkSHA(shabounds, "launch bounds")) { + checkSHA(shabounds, "launch bounds") || + checkSHA(shaversion, "compiler versions")) { break; } GPUSettingsProcessingRTC cachedSettings; @@ -237,6 +241,7 @@ int32_t GPUReconstructionCUDA::genRTC(std::string& filename, uint32_t& nCompile) fwrite(shacmd, 1, 20, fp) != 20 || fwrite(shakernels, 1, 20, fp) != 20 || fwrite(shabounds, 1, 20, fp) != 20 || + fwrite(shaversion, 1, 20, fp) != 20 || fwrite(&GetProcessingSettings().rtc, sizeof(GetProcessingSettings().rtc), 1, fp) != 1) { throw std::runtime_error("Error writing cache file"); } diff --git a/GPU/GPUTracking/CMakeLists.txt b/GPU/GPUTracking/CMakeLists.txt index 1b108bc74190d..67db16ffe9607 100644 --- a/GPU/GPUTracking/CMakeLists.txt +++ b/GPU/GPUTracking/CMakeLists.txt @@ -396,6 +396,7 @@ install(DIRECTORY utils DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GPU FILES_MATCHING PATTERN *.h) +set(GPUCA_COMPILER_VERSIONS "CUDA ${CMAKE_CUDA_COMPILER_VERSION} HIP ${hip_VERSION} ${CMAKE_HIP_COMPILER_VERSION} ROCM ${CMAKE_HIP_COMPILER_ROCM_ROOT} LLVM ${LLVM_PACKAGE_VERSION}") # GPUReconstructionLibrary needs to know which GPU backends are enabled for proper error messages configure_file(Base/GPUReconstructionAvailableBackends.template.h ${CMAKE_CURRENT_BINARY_DIR}/GPUReconstructionAvailableBackends.h) diff --git a/dependencies/FindO2GPU.cmake b/dependencies/FindO2GPU.cmake index 33925e8cf1341..438ec5e04306f 100644 --- a/dependencies/FindO2GPU.cmake +++ b/dependencies/FindO2GPU.cmake @@ -139,8 +139,8 @@ if(ENABLE_CUDA) message(${FAILURE_SEVERITY} "CUDA found but thrust not available") set(CMAKE_CUDA_COMPILER OFF) endif() - if (NOT CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL "12.6") - message(${FAILURE_SEVERITY} "CUDA Version too old: ${CMAKE_CUDA_COMPILER_VERSION}, 12.6 required") + if (NOT CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL "12.8") + message(${FAILURE_SEVERITY} "CUDA Version too old: ${CMAKE_CUDA_COMPILER_VERSION}, 12.8 required") set(CMAKE_CUDA_COMPILER OFF) endif() endif() @@ -279,7 +279,7 @@ if(ENABLE_HIP) elseif(NOT ENABLE_HIP STREQUAL "AUTO") message(FATAL_ERROR "HIP requested, but CMAKE_PREFIX_PATH env variable does not contain rocm folder!") endif() - if(hip_FOUND AND NOT hip_VERSION VERSION_GREATER_EQUAL "5.5") + if(hip_FOUND AND NOT hip_VERSION VERSION_GREATER_EQUAL "6.3") set(hip_FOUND 0) endif() if(hip_FOUND AND hipcub_FOUND AND rocthrust_FOUND AND rocprim_FOUND AND hip_HIPCC_EXECUTABLE AND hip_HIPIFY_PERL_EXECUTABLE)