From 23efe1b9199d55d2b52180c93a9110c0554fdf88 Mon Sep 17 00:00:00 2001 From: kent qian Date: Thu, 6 Aug 2026 13:34:28 -0500 Subject: [PATCH 1/2] Refactor TheRock packaging to derive GPU archs from GPU_TARGETS and use package alternatives for rocm10 --- CMakeLists.txt | 82 ++++++++++++++++++++------------ cmake/DetectPackageBackend.cmake | 36 ++++++++++---- 2 files changed, 79 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6074bc01395..6febba05299 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -454,41 +454,63 @@ if(MIGRAPHX_PACKAGE_BACKEND STREQUAL "therock") set(MIGRAPHX_THEROCK_ROCM_VERSION "" CACHE STRING "TheRock ROCm major.minor version suffix for package dependencies (e.g. 7.13)") set(MIGRAPHX_THEROCK_GPU_ARCH "" CACHE STRING - "TheRock GPU arch(es) for per-GPU package dependencies. \ -Semicolon-separated list (e.g. gfx90a;gfx942;gfx950) for per-GPU deps, \ -or empty for device-all meta-package deps.") + "Optional TheRock package architecture override, as a semicolon-separated \ +list (e.g. gfx90a;gfx942;gfx950). Defaults to GPU_TARGETS; use this override to \ +adapt to TheRock <=7.14 package naming conventions (e.g. gfx94x).") + set(_MGX_PACKAGE_GPU_ARCHES "${MIGRAPHX_THEROCK_GPU_ARCH}") + if(NOT _MGX_PACKAGE_GPU_ARCHES AND GPU_TARGETS) + foreach(mgx_gpu_target IN LISTS GPU_TARGETS) + string(REGEX REPLACE ":.*$" "" mgx_gpu_arch "${mgx_gpu_target}") + list(APPEND _MGX_PACKAGE_GPU_ARCHES "${mgx_gpu_arch}") + endforeach() + list(REMOVE_DUPLICATES _MGX_PACKAGE_GPU_ARCHES) + endif() set(DEPENDS_HIP_RUNTIME "amdrocm-runtime${MIGRAPHX_THEROCK_ROCM_VERSION}") - if(MIGRAPHX_THEROCK_GPU_ARCH) - # Collect per-GPU dependencies: one amdrocm-dnn/blas per arch - set(_MGX_GPU_DEPS "") - foreach(mgx_gpu_arch IN LISTS MIGRAPHX_THEROCK_GPU_ARCH) - if(MIGRAPHX_USE_MIOPEN) - list(APPEND _MGX_GPU_DEPS "amdrocm-dnn${MIGRAPHX_THEROCK_ROCM_VERSION}-${mgx_gpu_arch}") - endif() - if(MIGRAPHX_USE_ROCBLAS OR MIGRAPHX_USE_HIPBLASLT) - list(APPEND _MGX_GPU_DEPS "amdrocm-blas${MIGRAPHX_THEROCK_ROCM_VERSION}-${mgx_gpu_arch}") - endif() + # TheRock GPU libraries this build calls into + set(_MGX_GPU_LIBS "") + if(MIGRAPHX_USE_MIOPEN) + list(APPEND _MGX_GPU_LIBS "dnn") + endif() + if(MIGRAPHX_USE_ROCBLAS OR MIGRAPHX_USE_HIPBLASLT) + list(APPEND _MGX_GPU_LIBS "blas") + endif() + + # Boolean dependencies were added in rpm 4.13 where rpmbuild supports 'or' operators + rocm_find_program_version(rpmbuild GREATER_EQUAL 4.13.0 QUIET + OUTPUT_VARIABLE MIGRAPHX_RPMBUILD_VERSION) + + foreach(mgx_gpu_lib IN LISTS _MGX_GPU_LIBS) + set(_MGX_LIB "amdrocm-${mgx_gpu_lib}${MIGRAPHX_THEROCK_ROCM_VERSION}") + set(_MGX_ARCH_DEPS "") + foreach(mgx_gpu_arch IN LISTS _MGX_PACKAGE_GPU_ARCHES) + list(APPEND _MGX_ARCH_DEPS "${_MGX_LIB}-${mgx_gpu_arch}") endforeach() - list(LENGTH MIGRAPHX_THEROCK_GPU_ARCH _MGX_NUM_ARCHS) - if(_MGX_NUM_ARCHS GREATER 1) - # Multi-arch fat binary: per-GPU libs are Recommends (only the - # libs for the GPU actually present are needed at runtime). - string(REPLACE ";" ", " _MGX_GPU_DEPS_CSV "${_MGX_GPU_DEPS}") - set(CPACK_DEBIAN_RUNTIME_PACKAGE_RECOMMENDS "${_MGX_GPU_DEPS_CSV}") - set(CPACK_RPM_RUNTIME_PACKAGE_SUGGESTS "${_MGX_GPU_DEPS_CSV}") + list(LENGTH _MGX_ARCH_DEPS _MGX_NUM_ARCH_DEPS) + + set(_MGX_DEB_ALTS "${_MGX_LIB}") + list(APPEND _MGX_DEB_ALTS ${_MGX_ARCH_DEPS}) + if(_MGX_NUM_ARCH_DEPS GREATER 0) + string(REPLACE ";" " | " _MGX_DEB_DEP "${_MGX_DEB_ALTS}") else() - # Single-arch: hard dependency (user explicitly targets one GPU). - list(APPEND PACKAGE_DEPENDS ${_MGX_GPU_DEPS}) - endif() - else() - # Device-all: depend on arch-independent meta packages - if(MIGRAPHX_USE_MIOPEN) - list(APPEND PACKAGE_DEPENDS "amdrocm-dnn${MIGRAPHX_THEROCK_ROCM_VERSION}") + set(_MGX_DEB_DEP "${_MGX_LIB}") endif() - if(MIGRAPHX_USE_ROCBLAS OR MIGRAPHX_USE_HIPBLASLT) - list(APPEND PACKAGE_DEPENDS "amdrocm-blas${MIGRAPHX_THEROCK_ROCM_VERSION}") + rocm_package_add_deb_dependencies(DEPENDS "${_MGX_DEB_DEP}") + + # RPM solvers do not guarantee operand preference. Keep the device + # alternatives useful for provisioned environments, with meta as a + # valid fallback, but do not rely on their order for GPU detection. + set(_MGX_RPM_ALTS ${_MGX_ARCH_DEPS}) + list(APPEND _MGX_RPM_ALTS "${_MGX_LIB}") + if(_MGX_NUM_ARCH_DEPS GREATER 0 AND MIGRAPHX_RPMBUILD_VERSION_OK) + string(REPLACE ";" " or " _MGX_RPM_DEP "${_MGX_RPM_ALTS}") + set(_MGX_RPM_DEP "(${_MGX_RPM_DEP})") + else() + # Without boolean dependency support the meta package is all we can + # ask for; it is correct, just larger than necessary. + set(_MGX_RPM_DEP "${_MGX_LIB}") endif() - endif() + rocm_package_add_rpm_dependencies(DEPENDS "${_MGX_RPM_DEP}") + endforeach() rocm_package_add_deb_dependencies(SHARED_DEPENDS "amdrocm-runtime-dev${MIGRAPHX_THEROCK_ROCM_VERSION}") rocm_package_add_rpm_dependencies(SHARED_DEPENDS "amdrocm-runtime-devel${MIGRAPHX_THEROCK_ROCM_VERSION}") diff --git a/cmake/DetectPackageBackend.cmake b/cmake/DetectPackageBackend.cmake index 486d8efc33a..fe863aa4df8 100644 --- a/cmake/DetectPackageBackend.cmake +++ b/cmake/DetectPackageBackend.cmake @@ -28,14 +28,15 @@ # "therock" - TheRock environment (amdrocm-xxx deb/rpm packages) # "default" - Traditional ROCm with deb/rpm packages # -# Preferred usage (explicit): -# cmake -DMIGRAPHX_PACKAGE_BACKEND=therock -DMIGRAPHX_THEROCK_GPU_ARCH=gfx120x .. +# Preferred usage: +# cmake -DMIGRAPHX_PACKAGE_BACKEND=therock -DGPU_TARGETS="gfx942;gfx950" .. +# +# MIGRAPHX_THEROCK_GPU_ARCH is an optional package-architecture override. It is +# primarily for TheRock (<=7.14) repositories whose package suffix is a GPU family +# (for example gfx94x) rather than the raw GPU_TARGETS value (gfx942). # # If MIGRAPHX_PACKAGE_BACKEND is not set, falls back to auto-detection via # dpkg/rpm to check for installed amdrocm-runtime packages. -# -# When MIGRAPHX_PACKAGE_BACKEND=therock, MIGRAPHX_THEROCK_GPU_ARCH must be set -# to the target GPU architecture family that follows TheRock packaging requirements. function(_detect_therock_via_package_manager) set(_found FALSE) @@ -77,7 +78,9 @@ function(detect_package_backend) if(_MIGRAPHX_THEROCK_DETECTED) set(_default_backend "therock") message(STATUS "MIGraphX package backend auto-detected: therock (amdrocm-runtime found)") - message(STATUS " Hint: prefer explicit -DMIGRAPHX_PACKAGE_BACKEND=therock -DMIGRAPHX_THEROCK_GPU_ARCH=") + message(STATUS + " Hint: prefer explicit -DMIGRAPHX_PACKAGE_BACKEND=therock " + "-DGPU_TARGETS=[;...]") else() set(_default_backend "default") endif() @@ -96,15 +99,30 @@ function(detect_package_backend) if(MIGRAPHX_PACKAGE_BACKEND STREQUAL "therock") if(DEFINED ENV{GPU_ARCH_FOR_THEROCK}) - # Env name drops MIGRAPHX_ prefix to avoid the "unused MIGRAPHX_* env" warning. + # TheRock <=7.14 package-architecture override. set(_default_gpu_arch "$ENV{GPU_ARCH_FOR_THEROCK}") + elseif(GPU_TARGETS) + set(_default_gpu_arch "") + foreach(_gpu_target IN LISTS GPU_TARGETS) + string(REGEX REPLACE ":.*$" "" _gpu_arch "${_gpu_target}") + list(APPEND _default_gpu_arch "${_gpu_arch}") + endforeach() + list(REMOVE_DUPLICATES _default_gpu_arch) else() set(_default_gpu_arch "") endif() set(MIGRAPHX_THEROCK_GPU_ARCH "${_default_gpu_arch}" CACHE STRING - "TheRock GPU architecture family suffix (e.g. gfx120x ..)") + "Optional TheRock package architecture override. Defaults to GPU_TARGETS; use a legacy package family such as gfx94x when required.") - message(STATUS "MIGraphX package backend: therock (GPU arch: ${MIGRAPHX_THEROCK_GPU_ARCH})") + if(MIGRAPHX_THEROCK_GPU_ARCH) + message(STATUS + "MIGraphX package backend: therock " + "(package arches: ${MIGRAPHX_THEROCK_GPU_ARCH})") + else() + message(STATUS + "MIGraphX package backend: therock " + "(no package arches; using all-device meta packages)") + endif() else() message(STATUS "MIGraphX package backend: default (traditional ROCm)") endif() From f091d63b854f9254acc58017031bd688715fb221 Mon Sep 17 00:00:00 2001 From: kent qian Date: Fri, 14 Aug 2026 22:11:26 -0500 Subject: [PATCH 2/2] Polish the code more clear --- CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f81a3c1f131..5e8b0365fd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -477,8 +477,10 @@ if(MIGRAPHX_PACKAGE_BACKEND STREQUAL "therock") "Optional TheRock package architecture override, as a semicolon-separated \ list (e.g. gfx90a;gfx942;gfx950). Defaults to GPU_TARGETS; use this override to \ adapt to TheRock <=7.14 package naming conventions (e.g. gfx94x).") - set(_MGX_PACKAGE_GPU_ARCHES "${MIGRAPHX_THEROCK_GPU_ARCH}") - if(NOT _MGX_PACKAGE_GPU_ARCHES AND GPU_TARGETS) + if(MIGRAPHX_THEROCK_GPU_ARCH) + set(_MGX_PACKAGE_GPU_ARCHES "${MIGRAPHX_THEROCK_GPU_ARCH}") + else() + set(_MGX_PACKAGE_GPU_ARCHES "") foreach(mgx_gpu_target IN LISTS GPU_TARGETS) string(REGEX REPLACE ":.*$" "" mgx_gpu_arch "${mgx_gpu_target}") list(APPEND _MGX_PACKAGE_GPU_ARCHES "${mgx_gpu_arch}")