The v6 fixes several issues raised in Github PR: https://github.com/gentoo/gentoo/pull/26784
Changelog against v5: 1. Update outdated examples and comments 2. QA fixes 3. Rename rocm_src_{test,configure} to rocm-{test,configure} to avoid confusion 4. Simplify rocm-test function 5. Change the reference of AMDGPU targets and GPU product matching. Yiyang Wu (2): rocm.eclass: new eclass profiles/desc: add amdgpu_targets.desc for USE_EXPAND eclass/rocm.eclass | 284 ++++++++++++++++++++++++++++++ profiles/base/make.defaults | 2 +- profiles/desc/amdgpu_targets.desc | 17 ++ 3 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 eclass/rocm.eclass create mode 100644 profiles/desc/amdgpu_targets.desc Interdiff against v5: diff --git a/eclass/rocm.eclass b/eclass/rocm.eclass index 679b1af54e0a..1866d6b7cc94 100644 --- a/eclass/rocm.eclass +++ b/eclass/rocm.eclass @@ -18,13 +18,16 @@ # # Most ROCm packages use cmake as build system, so this eclass does not export # phase functions which overwrites the phase functions in cmake.eclass. Ebuild -# should explicitly call rocm_src_* in src_configure and src_test. +# should explicitly call rocm-{configure,test} in src_configure and src_test. # # @EXAMPLE: -# # Example for ROCm packages in https://github.com/ROCmSoftwarePlatform # @CODE +# # Example ebuild for ROCm library in https://github.com/ROCmSoftwarePlatform +# # whcih depends on rocBLAS # inherit cmake rocm +# # ROCm libraries SRC_URI is usually in form of: # SRC_URI="https://github.com/ROCmSoftwarePlatform/${PN}/archive/rocm-${PV}.tar.gz -> ${P}.tar.gz" +# S=${WORKDIR}/${PN}-rocm-${PV} # SLOT="0/$(ver_cut 1-2)" # IUSE="test" # REQUIRED_USE="${ROCM_REQUIRED_USE}" @@ -35,17 +38,15 @@ # sci-libs/rocBLAS:${SLOT}[${ROCM_USEDEP}] # " # -# S=${WORKDIR}/${PN}-rocm-${PV} -# # src_configure() { # local mycmakeargs=( # -DBUILD_CLIENTS_TESTS=$(usex test ON OFF) # ) -# rocm_src_configure +# rocm-configure # } # # src_test() { -# rocm_src_test +# rocm-test # } # @CODE # @@ -53,7 +54,7 @@ # # rocBLAS, and use comma seperated ${HCC_AMDGPU_TARGET} to determine GPU # # architecture to compile. Requires ROCm version >5. # @CODE -# ROCM_VERSION=5 +# ROCM_VERSION=5.1 # inherit rocm # IUSE="rocm" # REQUIRED_USE="rocm? ( ${ROCM_REQUIRED_USE} )" @@ -206,25 +207,31 @@ get_amdgpu_flags() { # @FUNCTION: check_rw_permission # @USAGE: check_rw_permission <file> # @DESCRIPTION: -# check read and write permissions on specific files. -# allow using wildcard, for example check_rw_permission /dev/dri/render* +# check read and write permissions on a specific file, die if no permission. +# @EXAMPLE: +# @CODE +# check_rw_permission /dev/kfd +# CODE check_rw_permission() { - [[ -r $1 ]] && [[ -w $1 ]] || die \ - "Portage do not have read or write permissions on $1! \n Make sure both are in render group and check the permissions." + if [[ ! -r $1 ]] || [[ ! -w $1 ]]; then + eerror "Portage do not have read or write permissions on $1!" + eerror "Make sure both are in render group and check the permissions." + die "No permissions on $1" + fi } # == phase functions == -# @FUNCTION: rocm_src_configure +# @FUNCTION: rocm-configure # @DESCRIPTION: -# configure rocm packages, and setting common cmake arguments -rocm_src_configure() { - # allow acces to hardware +# configure rocm packages, and setting common cmake arguments. Only for ROCm +# libraries in https://github.com/ROCmSoftwarePlatform using cmake. +rocm-configure() { + # avoid sandbox violation addpredict /dev/kfd addpredict /dev/dri/ mycmakeargs+=( - -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr" -DAMDGPU_TARGETS="$(get_amdgpu_flags)" -DCMAKE_SKIP_RPATH=TRUE ) @@ -232,46 +239,45 @@ rocm_src_configure() { CXX="hipcc" cmake_src_configure } -# @FUNCTION: rocm_src_test +# @FUNCTION: rocm-test # @DESCRIPTION: -# Test whether valid GPU device is present. If so, find how to, and execute test. -# ROCm packages can have to test mechanism: +# Test whether valid GPU device is present. If so, execute test. +# @EXAMPLE: +# ROCm packages can have two test scenarioes: # 1. cmake_src_test. MAKEOPTS="-j1" ensures only one test on GPU at a time; -# 2. one single gtest binary called "${PN,,}"-test; -# 3. Some package like rocFFT have alternative test like rocfft-selftest; -# 4. Custome testing binaries like dev-libs/rccl. Use ${ROCM_TESTS} to specify. -rocm_src_test() { +# @CODE +# LD_LIBRARY_PATH=<path-to-lib> rocm-test --cmake +# @CODE +# 2. one gtest binary called "${PN,,}"-test in ${BUILD_DIR}/clients/staging; +# @CODE +# cd "${BUILD_DIR}"/clients/staging || die +# LD_LIBRARY_PATH=<path-to-lib> rocm-test "${PN,,}"-test +# @CODE +# Some packages like rocFFT have two test binaries like rocfft-selftest; +# packages like dev-libs/rccl have test binary with custom names. +# @CODE +# cd "${BUILD_DIR}"/clients/staging || die +# export LD_LIBRARY_PATH=<path-to-lib> +# cd <test-bin-location> || die +# rocm-test <test-bin-1> +# rocm-test <test-bin-2> +# @CODE +rocm-test() { # grant and check permissions on /dev/kfd and /dev/dri/render* for device in /dev/kfd /dev/dri/render*; do - addwrite ${device} - check_rw_permission ${device} + addwrite "${device}" + check_rw_permission "${device}" done - : ${LD_LIBRARY_PATH:="${BUILD_DIR}/clients:${BUILD_DIR}/src:${BUILD_DIR}/library:${BUILD_DIR}/library/src:${BUILD_DIR}/library/src/device"} - export LD_LIBRARY_PATH - if grep -q 'build test:' "${BUILD_DIR}"/build.ninja; then - MAKEOPTS="-j1" cmake_src_test - elif [[ -d ${BUILD_DIR}/clients/staging ]]; then - cd "${BUILD_DIR}/clients/staging" || die "Test directory not found!" - for test_program in "${PN,,}-"*test; do - if [[ -x ${test_program} ]]; then - edob ./${test_program} - else - die "The test program ${test_program} does not exist or cannot be excuted!" - fi - done - elif [[ -n ${ROCM_TESTS} ]]; then - for test_program in ${ROCM_TESTS}; do - cd "${BUILD_DIR}" || die - if [[ -x ${test_program} ]]; then - edob ./${test_program} - else - die "The test program ${test_program} does not exist or cannot be excuted!" - fi - done - else - die "There is no cmake tests, no \${ROCM_TESTS} executable provided, nor ${BUILD_DIR}/clients/staging where test program might be located." - fi + case ${1} in + --cmake) + # Avoid multi jobs running that may cause GPU error or CPU overload + MAKEOPTS="-j1" cmake_src_test + ;; + *) + edob ./${1} + ;; + esac } _ROCM_ECLASS=1 diff --git a/profiles/desc/amdgpu_targets.desc b/profiles/desc/amdgpu_targets.desc index 8a3db2b56dab..df013d4f2c08 100644 --- a/profiles/desc/amdgpu_targets.desc +++ b/profiles/desc/amdgpu_targets.desc @@ -1,7 +1,9 @@ # Copyright 1999-2022 Gentoo Authors. # Distributed under the terms of the GNU General Public License v2 -# Copied from https://www.coelacanth-dream.com/posts/2019/12/30/did-rid-product-matome-p2/#fn:67 +# Refereneļ¼ +# GPU name and Architecture codename: https://github.com/GPUOpen-Tools/device_info/blob/master/DeviceInfo.cpp +# See also: https://www.coelacanth-dream.com/posts/2019/12/30/did-rid-product-matome-p2/#fn:67 gfx803 - Fiji GPU, codename fiji, including Radeon R9 Nano/Fury/FuryX, Radeon Pro Duo, FirePro S9300x2, Radeon Instinct MI8 gfx900 - Vega GPU, codename vega10, including Radeon Vega Frontier Edition, Radeon RX Vega 56/64, Radeon RX Vega 64 Liquid, Radeon Pro Vega 48/56/64/64X, Radeon Pro WX 8200/9100, Radeon Pro V320/V340/SSG, Radeon Instinct MI25 -- 2.34.1