summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYiyangWu <xgreenlandforwyy@gmail.com>2021-08-21 21:53:18 +0800
committerBenda Xu <heroxbd@gentoo.org>2021-08-27 19:51:16 +0800
commit6347499d4e8375f342b9f71a003ad4d757ab0eac (patch)
treed8b76c4e59337f16deedc95b1351ea32c557f644 /sci-libs/rocBLAS
parentmedia-video/pipewire: Synced live ebuild (diff)
downloadgentoo-6347499d4e8375f342b9f71a003ad4d757ab0eac.tar.gz
gentoo-6347499d4e8375f342b9f71a003ad4d757ab0eac.tar.bz2
gentoo-6347499d4e8375f342b9f71a003ad4d757ab0eac.zip
sci-libs/rocBLAS: Next generation BLAS implementation for ROCm
Migrated from ::science, rocBLAS is the core math libraries on ROCm platform for high performance computing on AMDGPU, dependency of MIOpen. Current version 4.3.0, support nearly all major AMD GPUs, especially for GCN, CDNA and RDNA2 (nightly) cards. Closes: https://bugs.gentoo.org/732952 Closes: https://bugs.gentoo.org/804181 Closes: https://github.com/gentoo/gentoo/pull/22065 Package-Manager: Portage-3.0.20, Repoman-3.0.3 Signed-off-by: Yiyang Wu <xgreenlandforwyy@gmail.com> Signed-off-by: Benda Xu <heroxbd@gentoo.org>
Diffstat (limited to 'sci-libs/rocBLAS')
-rw-r--r--sci-libs/rocBLAS/Manifest2
-rw-r--r--sci-libs/rocBLAS/files/Tensile-4.3.0-hsaco-compile-specified-arch.patch96
-rw-r--r--sci-libs/rocBLAS/files/Tensile-4.3.0-output-commands.patch23
-rw-r--r--sci-libs/rocBLAS/files/rocBLAS-4.3.0-change-default-Tensile-library-dir.patch39
-rw-r--r--sci-libs/rocBLAS/files/rocBLAS-4.3.0-fix-glibc-2.32-and-above.patch25
-rw-r--r--sci-libs/rocBLAS/files/rocBLAS-4.3.0-link-system-blas.patch24
-rw-r--r--sci-libs/rocBLAS/metadata.xml19
-rw-r--r--sci-libs/rocBLAS/rocBLAS-4.3.0.ebuild139
8 files changed, 367 insertions, 0 deletions
diff --git a/sci-libs/rocBLAS/Manifest b/sci-libs/rocBLAS/Manifest
new file mode 100644
index 000000000000..00865310a02d
--- /dev/null
+++ b/sci-libs/rocBLAS/Manifest
@@ -0,0 +1,2 @@
+DIST rocm-Tensile-4.3.0.tar.gz 14250149 BLAKE2B 030138eaca2a0aadd96801e6dbd72e510716dd90553ef3795c5e04e00a34a05ecae82b24f755e4033a4acfcdb1cf26291da1e7902bb090f89a010d403e832beb SHA512 126db0b413c716fba8d5be9bff7a44fd1badacbf32f3db8d0db649819177db37ebd56fd22dd3c809655f5d29675be115e698cd10bc3d0b4b23878ae3726fce47
+DIST rocm-rocBLAS-4.3.0.tar.gz 11569970 BLAKE2B f11b0acf2bbd5737b036142d3b2cc1e18c38e088a8b7db58156d478dd6718befbb82bb7fd43a38fe64a5427124c5ad5241fa37977f094e6efd195d168d3e5f65 SHA512 490ab1c1e98a8b311ad5630515c448d9bb0a2bf588a08bcbebee345e2954d616b4ffe7c2e03dadca82c590438c42afccb98fe8ba00856aece101b5ffe62ef1e0
diff --git a/sci-libs/rocBLAS/files/Tensile-4.3.0-hsaco-compile-specified-arch.patch b/sci-libs/rocBLAS/files/Tensile-4.3.0-hsaco-compile-specified-arch.patch
new file mode 100644
index 000000000000..8e6753781a2a
--- /dev/null
+++ b/sci-libs/rocBLAS/files/Tensile-4.3.0-hsaco-compile-specified-arch.patch
@@ -0,0 +1,96 @@
+https://github.com/ROCmSoftwarePlatform/Tensile/issues/1395
+https://github.com/ROCmSoftwarePlatform/Tensile/pull/1398
+
+--- a/Tensile/TensileCreateLibrary.py
++++ b/Tensile/TensileCreateLibrary.py
+@@ -136,6 +136,35 @@ def which(p):
+ return candidate
+ return None
+
++def splitArchs():
++ # Helper for architecture
++ def isSupported(arch):
++ return globalParameters["AsmCaps"][arch]["SupportedISA"] and \
++ globalParameters["AsmCaps"][arch]["SupportedSource"]
++
++ if ";" in globalParameters["Architecture"]:
++ wantedArchs = globalParameters["Architecture"].split(";")
++ else:
++ wantedArchs = globalParameters["Architecture"].split("_")
++ archs = []
++ cmdlineArchs = []
++ if "all" in wantedArchs:
++ for arch in globalParameters['SupportedISA']:
++ if isSupported(arch):
++ if (arch == (9,0,6) or arch == (9,0,8) or arch == (9,0,10)):
++ if (arch == (9,0,10)):
++ archs += [gfxName(arch) + '-xnack+']
++ cmdlineArchs += [gfxName(arch) + ':xnack+']
++ archs += [gfxName(arch) + '-xnack-']
++ cmdlineArchs += [gfxName(arch) + ':xnack-']
++ else:
++ archs += [gfxName(arch)]
++ cmdlineArchs += [gfxName(arch)]
++ else:
++ for arch in wantedArchs:
++ archs += [re.sub(":", "-", arch)]
++ cmdlineArchs += [arch]
++ return archs, cmdlineArchs
+
+ def buildSourceCodeObjectFile(CxxCompiler, outputPath, kernelFile):
+ buildPath = ensurePath(os.path.join(globalParameters['WorkingPath'], 'code_object_tmp'))
+@@ -149,24 +178,8 @@ def buildSourceCodeObjectFile(CxxCompiler, outputPath, kernelFile):
+ objectFilename = base + '.o'
+ soFilename = base + '.so'
+
+- def isSupported(arch):
+- return globalParameters["AsmCaps"][arch]["SupportedISA"] and \
+- globalParameters["AsmCaps"][arch]["SupportedSource"]
+-
+ if (CxxCompiler == "hipcc"):
+- archs = []
+- cmdlineArchs = []
+- for arch in globalParameters['SupportedISA']:
+- if isSupported(arch):
+- if (arch == (9,0,6) or arch == (9,0,8) or arch == (9,0,10)):
+- if (arch == (9,0,10)):
+- archs += [gfxName(arch) + '-xnack+']
+- cmdlineArchs += [gfxName(arch) + ':xnack+']
+- archs += [gfxName(arch) + '-xnack-']
+- cmdlineArchs += [gfxName(arch) + ':xnack-']
+- else:
+- archs += [gfxName(arch)]
+- cmdlineArchs += [gfxName(arch)]
++ archs, cmdlineArchs = splitArchs()
+
+ archFlags = ['--offload-arch=' + arch for arch in cmdlineArchs]
+
+@@ -1063,11 +1076,6 @@ def buildObjectFileNames(solutionWriter, kernelWriterSource, kernelWriterAssembl
+ sourceKernels = list([k for k in kernels if k['KernelLanguage'] == 'Source'])
+ asmKernels = list([k for k in kernels if k['KernelLanguage'] == 'Assembly'])
+
+- # Helper for architecture
+- def isSupported(arch):
+- return globalParameters["AsmCaps"][arch]["SupportedISA"] and \
+- globalParameters["AsmCaps"][arch]["SupportedSource"]
+-
+ # Build a list of kernel object names.
+ for kernel in sourceKernels:
+ sourceKernelNames += [kernelWriterSource.getKernelFileBase(kernel)]
+@@ -1081,15 +1089,7 @@ def buildObjectFileNames(solutionWriter, kernelWriterSource, kernelWriterAssembl
+
+ # Source based kernels are built for all supported architectures
+ if (cxxCompiler == 'hipcc'):
+- sourceArchs = []
+- for arch in globalParameters['SupportedISA']:
+- if isSupported(arch):
+- if (arch == (9,0,6) or arch == (9,0,8) or arch == (9,0,10)):
+- if (arch == (9,0,10)):
+- sourceArchs += [gfxName(arch) + '-xnack+']
+- sourceArchs += [gfxName(arch) + '-xnack-']
+- else:
+- sourceArchs += [gfxName(arch)]
++ sourceArchs, _ = splitArchs()
+ else:
+ raise RuntimeError("Unknown compiler %s" % cxxCompiler)
+
diff --git a/sci-libs/rocBLAS/files/Tensile-4.3.0-output-commands.patch b/sci-libs/rocBLAS/files/Tensile-4.3.0-output-commands.patch
new file mode 100644
index 000000000000..be5a4db21429
--- /dev/null
+++ b/sci-libs/rocBLAS/files/Tensile-4.3.0-output-commands.patch
@@ -0,0 +1,23 @@
+diff --color -uprN orig/Tensile/cmake/TensileConfig.cmake Tensile-rocm-4.3.0/Tensile/cmake/TensileConfig.cmake
+--- orig/Tensile/cmake/TensileConfig.cmake 2021-08-18 17:48:00.115478470 +0800
++++ Tensile-rocm-4.3.0/Tensile/cmake/TensileConfig.cmake 2021-08-18 17:48:49.963478801 +0800
+@@ -234,6 +234,7 @@ function(TensileCreateLibraryFiles
+ COMMENT "Generating Tensile Libraries"
+ OUTPUT ${Tensile_EMBED_LIBRARY_SOURCE};${Tensile_MANIFEST_CONTENTS}
+ COMMAND ${CommandLine}
++ USES_TERMINAL
+ )
+
+ set("${Tensile_VAR_PREFIX}_ALL_FILES" ${Tensile_MANIFEST_CONTENTS} PARENT_SCOPE)
+diff --color -uprN orig/Tensile/Common.py Tensile-rocm-4.3.0/Tensile/Common.py
+--- orig/Tensile/Common.py 2021-08-18 17:48:00.075478470 +0800
++++ Tensile-rocm-4.3.0/Tensile/Common.py 2021-08-18 17:48:23.287478624 +0800
+@@ -179,7 +179,7 @@ globalParameters["PrintTensorD"] = 0
+ globalParameters["PrintTensorRef"] = 0 # Print reference tensor. 0x1=after init; 0x2=after copy-back; 0x3=both
+ globalParameters["PrintIndexAssignments"] = 0 # Print the tensor index assignment info
+ globalParameters["PrintWinnersOnly"] = False # Only print the solutions which become the fastest
+-globalParameters["PrintCodeCommands"] = False # print the commands used to generate the code objects (asm,link,hip-clang, etc)
++globalParameters["PrintCodeCommands"] = True # print the commands used to generate the code objects (asm,link,hip-clang, etc)
+ globalParameters["DumpTensors"] = False # If True, dump tensors to binary files instead of printing them.
+
+ # TODO - remove this when NewClient is mainstream
diff --git a/sci-libs/rocBLAS/files/rocBLAS-4.3.0-change-default-Tensile-library-dir.patch b/sci-libs/rocBLAS/files/rocBLAS-4.3.0-change-default-Tensile-library-dir.patch
new file mode 100644
index 000000000000..1841424c6e56
--- /dev/null
+++ b/sci-libs/rocBLAS/files/rocBLAS-4.3.0-change-default-Tensile-library-dir.patch
@@ -0,0 +1,39 @@
+change the default rocm tensile library search path
+--- orig/library/src/tensile_host.cpp 2021-08-21 17:56:47.040481580 +0800
++++ rocBLAS-rocm-4.3.0/library/src/tensile_host.cpp 2021-08-21 17:58:46.360482372 +0800
+@@ -489,34 +489,7 @@ namespace
+ }
+ else
+ {
+-#ifndef ROCBLAS_STATIC_LIB
+- Dl_info info;
+-
+- // Find the location of librocblas.so
+- // Fall back on hard-coded path if static library or not found
+- // [Use a C API (rocblas_sccal) *not* defined in this file to
+- // avoid compile-time resolution of the function pointer; cf.
+- // https://man7.org/linux/man-pages/man3/dladdr.3.html "BUGS"]
+-
+- if(dladdr((void*)rocblas_sscal, &info))
+- {
+- path = info.dli_fname;
+- path = std::string{dirname(&path[0])};
+- }
+- else
+-#endif
+- {
+- path = "/opt/rocm/rocblas/lib";
+- }
+-
+- // Find the location of the libraries
+- if(TestPath(path + "/../../Tensile/library"))
+- path += "/../../Tensile/library";
+- else
+- path += "/library";
+-
+- if(TestPath(path + "/" + processor))
+- path += "/" + processor;
++ path="@GENTOO_PORTAGE_EPREFIX@/usr/lib64/rocblas/library";
+ }
+
+ // only load modules for the current architecture
diff --git a/sci-libs/rocBLAS/files/rocBLAS-4.3.0-fix-glibc-2.32-and-above.patch b/sci-libs/rocBLAS/files/rocBLAS-4.3.0-fix-glibc-2.32-and-above.patch
new file mode 100644
index 000000000000..a4d9f0bab344
--- /dev/null
+++ b/sci-libs/rocBLAS/files/rocBLAS-4.3.0-fix-glibc-2.32-and-above.patch
@@ -0,0 +1,25 @@
+https://sourceware.org/glibc/wiki/Release/2.32#Deprectation_sys_siglist.2C__sys_siglist.2C_sys_sigabbrev
+
+--- rocBLAS-rocm-4.1.0/clients/gtest/rocblas_test.cpp
++++ rocBLAS-rocm-4.1.0/clients/gtest/rocblas_test.cpp
+@@ -173,7 +173,7 @@ void catch_signals_and_exceptions_as_fai
+ // Set up the return point, and handle siglongjmp returning back to here
+ if(sigsetjmp(t_handler.sigjmp_buf, true))
+ {
+- FAIL() << "Received " << sys_siglist[t_handler.signal] << " signal";
++ FAIL() << "Received " << strsignal(t_handler.signal) << " signal";
+ }
+ else
+ {
+
+--- rocBLAS-rocm-4.1.0/clients/include/utility.hpp
++++ rocBLAS-rocm-4.1.0/clients/include/utility.hpp
+@@ -39,7 +39,7 @@
+ // puts, putchar, fputs, printf, fprintf, vprintf, vfprintf: Use rocblas_cout or rocblas_cerr
+ // sprintf, vsprintf: Possible buffer overflows; us snprintf or vsnprintf instead
+ // strerror: Thread-unsafe; use snprintf / dprintf with %m or strerror_* alternatives
+-// strsignal: Thread-unsafe; use sys_siglist[signal] instead
++// strsignal: Thread-unsafe; use strsignal(signal) instead
+ // strtok: Thread-unsafe; use strtok_r
+ // gmtime, ctime, asctime, localtime: Thread-unsafe
+ // tmpnam: Thread-unsafe; use mkstemp or related functions instead
diff --git a/sci-libs/rocBLAS/files/rocBLAS-4.3.0-link-system-blas.patch b/sci-libs/rocBLAS/files/rocBLAS-4.3.0-link-system-blas.patch
new file mode 100644
index 000000000000..184b76d7ef38
--- /dev/null
+++ b/sci-libs/rocBLAS/files/rocBLAS-4.3.0-link-system-blas.patch
@@ -0,0 +1,24 @@
+Link system blas libraries rather than the downloaded libraries (in install.sh)
+
+--- orig/clients/benchmarks/CMakeLists.txt
++++ rocBLAS-rocm-4.2.0/clients/benchmarks/CMakeLists.txt
+@@ -49,7 +49,7 @@ target_include_directories( rocblas-benc
+ $<BUILD_INTERFACE:${BLIS_INCLUDE_DIR}>
+ )
+
+-target_link_libraries( rocblas-bench PRIVATE rocblas_fortran_client roc::rocblas lapack cblas )
++target_link_libraries( rocblas-bench PRIVATE rocblas_fortran_client roc::rocblas lapack cblas -lblas )
+ if(LINK_BLIS)
+ target_link_libraries( rocblas-bench PRIVATE ${BLIS_LIBRARY} )
+ endif()
+--- orig/clients/gtest/CMakeLists.txt
++++ rocBLAS-rocm-4.2.0/clients/gtest/CMakeLists.txt
+@@ -129,7 +129,7 @@ target_include_directories( rocblas-test
+ $<BUILD_INTERFACE:${BLIS_INCLUDE_DIR}>
+ )
+
+-target_link_libraries( rocblas-test PRIVATE rocblas_fortran_client roc::rocblas lapack cblas ${GTEST_LIBRARIES} )
++target_link_libraries( rocblas-test PRIVATE rocblas_fortran_client roc::rocblas lapack cblas -lblas ${GTEST_LIBRARIES} )
+ if(LINK_BLIS)
+ target_link_libraries( rocblas-test PRIVATE ${BLIS_LIBRARY} )
+ endif()
diff --git a/sci-libs/rocBLAS/metadata.xml b/sci-libs/rocBLAS/metadata.xml
new file mode 100644
index 000000000000..44cdde5646e8
--- /dev/null
+++ b/sci-libs/rocBLAS/metadata.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM 'http://www.gentoo.org/dtd/metadata.dtd'>
+<pkgmetadata>
+ <maintainer type="project">
+ <email>sci@gentoo.org</email>
+ </maintainer>
+ <maintainer type="person">
+ <email>gentoo@holzke.net</email>
+ <name>Wilfried Holzke</name>
+ </maintainer>
+ <maintainer type="person">
+ <email>xgreenlandforwyy@gmail.com</email>
+ <name>Yiyang Wu</name>
+ </maintainer>
+ <use>
+ <flag name="test">Perform rocblas-test to compare the result between rocBLAS and system BLAS.</flag>
+ <flag name="benchmark">Build and install rocblas-bench.</flag>
+ </use>
+</pkgmetadata>
diff --git a/sci-libs/rocBLAS/rocBLAS-4.3.0.ebuild b/sci-libs/rocBLAS/rocBLAS-4.3.0.ebuild
new file mode 100644
index 000000000000..4e05309d0c48
--- /dev/null
+++ b/sci-libs/rocBLAS/rocBLAS-4.3.0.ebuild
@@ -0,0 +1,139 @@
+# Copyright 1999-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..9} )
+
+inherit cmake prefix python-any-r1
+
+DESCRIPTION="AMD's library for BLAS on ROCm."
+HOMEPAGE="https://github.com/ROCmSoftwarePlatform/rocBLAS"
+SRC_URI="https://github.com/ROCmSoftwarePlatform/rocBLAS/archive/rocm-${PV}.tar.gz -> rocm-${P}.tar.gz
+ https://github.com/ROCmSoftwarePlatform/Tensile/archive/rocm-${PV}.tar.gz -> rocm-Tensile-${PV}.tar.gz"
+
+LICENSE="MIT"
+KEYWORDS="~amd64"
+IUSE="benchmark test"
+SLOT="0/$(ver_cut 1-2)"
+
+BDEPEND="
+ dev-util/rocm-cmake
+ !dev-util/Tensile
+ $(python_gen_any_dep '
+ dev-python/msgpack[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ ')
+"
+
+DEPEND="
+ dev-util/hip:${SLOT}
+ dev-libs/msgpack
+ test? ( virtual/blas
+ dev-cpp/gtest
+ sys-libs/libomp )
+ benchmark? ( virtual/blas
+ sys-libs/libomp )
+"
+RESTRICT="!test? ( test )"
+
+python_check_deps() {
+ has_version "dev-python/pyyaml[${PYTHON_USEDEP}]" &&
+ has_version "dev-python/msgpack[${PYTHON_USEDEP}]"
+}
+
+S="${WORKDIR}"/${PN}-rocm-${PV}
+
+PATCHES=("${FILESDIR}"/${PN}-4.3.0-fix-glibc-2.32-and-above.patch
+ "${FILESDIR}"/${PN}-4.3.0-change-default-Tensile-library-dir.patch
+ "${FILESDIR}"/${PN}-4.3.0-link-system-blas.patch )
+
+src_prepare() {
+ eapply_user
+
+ pushd "${WORKDIR}"/Tensile-rocm-${PV} || die
+ eapply "${FILESDIR}/Tensile-${PV}-hsaco-compile-specified-arch.patch" # backported from upstream, should remove after 4.3.0
+ eapply "${FILESDIR}/Tensile-4.3.0-output-commands.patch"
+ popd || die
+
+ # Fit for Gentoo FHS rule
+ sed -e "/PREFIX rocblas/d" \
+ -e "/<INSTALL_INTERFACE/s:include:include/rocblas:" \
+ -e "s:rocblas/include:include/rocblas:" \
+ -e "s:\\\\\${CPACK_PACKAGING_INSTALL_PREFIX}rocblas/lib:${EPREFIX}/usr/$(get_libdir)/rocblas:" \
+ -e "s:share/doc/rocBLAS:share/doc/${P}:" \
+ -e "/rocm_install_symlink_subdir( rocblas )/d" -i library/src/CMakeLists.txt || die
+
+ # Use setup.py to install Tensile rather than pip
+ sed -r -e "/pip install/s:([^ \"\(]*python) -m pip install ([^ \"\)]*):\1 setup.py install --single-version-externally-managed --root / WORKING_DIRECTORY \2:g" -i cmake/virtualenv.cmake
+
+ sed -e "s:,-rpath=.*\":\":" -i clients/CMakeLists.txt || die
+
+ cmake_src_prepare
+ eprefixify library/src/tensile_host.cpp
+}
+
+src_configure() {
+ # allow acces to hardware
+ addpredict /dev/kfd
+ addpredict /dev/dri/
+ addpredict /dev/random
+
+ export PATH="${EPREFIX}/usr/lib/llvm/roc/bin:${PATH}"
+
+ local mycmakeargs=(
+ -DTensile_LOGIC="asm_full"
+ -DTensile_COMPILER="hipcc"
+ -DTensile_LIBRARY_FORMAT="msgpack"
+ -DTensile_CODE_OBJECT_VERSION="V3"
+ -DTensile_TEST_LOCAL_PATH="${WORKDIR}/Tensile-rocm-${PV}"
+ -DBUILD_WITH_TENSILE=ON
+ -DBUILD_WITH_TENSILE_HOST=ON
+ -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr"
+ -DCMAKE_INSTALL_INCLUDEDIR="include/rocblas"
+ -DCMAKE_SKIP_RPATH=TRUE
+ -DBUILD_TESTING=OFF
+ -DBUILD_CLIENTS_SAMPLES=OFF
+ -DBUILD_CLIENTS_TESTS=$(usex test ON OFF)
+ -DBUILD_CLIENTS_BENCHMARKS=$(usex benchmark ON OFF)
+ ${AMDGPU_TARGETS+-DAMDGPU_TARGETS="${AMDGPU_TARGETS}"}
+ -D__skip_rocmclang="ON" ## fix cmake-3.21 configuration issue caused by officialy support programming language "HIP"
+ )
+
+ CXX="hipcc" cmake_src_configure
+
+ # do not rerun cmake and the build process in src_install
+ sed -e '/RERUN/,+1d' -i "${BUILD_DIR}"/build.ninja || die
+}
+
+check_rw_permission() {
+ cmd="[ -r $1 ] && [ -w $1 ]"
+ errormsg="${user} do not have read and write permissions on $1! \n Make sure ${user} is in render group and check the permissions."
+ if has sandbox ${FEATURES}; then
+ user=portage
+ su portage -c "${cmd}" || die ${errormsg}
+ else
+ user=`whoami`
+ ${cmd} || die ${errormsg}
+ fi
+}
+
+src_test() {
+ # check permissions on /dev/kfd and /dev/dri/render*
+ check_rw_permission /dev/kfd
+ check_rw_permission /dev/dri/render*
+ addwrite /dev/kfd
+ addwrite /dev/dri/
+ cd "${BUILD_DIR}/clients/staging" || die
+ ROCBLAS_TENSILE_LIBPATH="${BUILD_DIR}/Tensile/library" ./rocblas-test
+}
+
+src_install() {
+ cmake_src_install
+
+ if use benchmark; then
+ cd "${BUILD_DIR}" || die
+ dolib.so clients/librocblas_fortran_client.so
+ dobin clients/staging/rocblas-bench
+ fi
+}