CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
749 lines
25 KiB
Bash
749 lines
25 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# ########################################################################
|
|
# Copyright (c) 2022-2024 Advanced Micro Devices, Inc. All rights reserved.
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
# in the Software without restriction, including without limitation the rights
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell cop-
|
|
# ies of the Software, and to permit persons to whom the Software is furnished
|
|
# to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in all
|
|
# copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IM-
|
|
# PLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNE-
|
|
# CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
#
|
|
# ########################################################################
|
|
|
|
#set -x #echo on
|
|
|
|
# #################################################
|
|
# helper functions
|
|
# #################################################
|
|
function display_help()
|
|
{
|
|
echo "rocSPARSELt build & installation helper script"
|
|
echo "./install [-h|--help] "
|
|
echo " [-h|--help] prints this help message"
|
|
# echo " [--prefix] Specify an alternate CMAKE_INSTALL_PREFIX for cmake"
|
|
echo " [-i|--install] install after build"
|
|
echo " [-d|--dependencies] install build dependencies"
|
|
echo " [-a|--architecture] Set AMD GPU architecture target(s), e.g., all, gfx000, gfx900, gfx906:xnack-;gfx908:xnack-"
|
|
echo " [-c|--clients] build library clients too (combines with -i & -d)"
|
|
echo " [--cpu_ref_lib <lib>] specify library to use for CPU reference code in testing (blis or lapack)"
|
|
echo " [-r]--relocatable] create a package to support relocatable ROCm"
|
|
echo " [-g|--debug] -DCMAKE_BUILD_TYPE=Debug (default is =Release)"
|
|
echo " [-k|--relwithdebinfo] -DCMAKE_BUILD_TYPE=RelWithDebInfo"
|
|
echo " [--static] build static library"
|
|
echo " [--address-sanitizer] build with address sanitizer"
|
|
echo " [--codecoverage] build with code coverage profiling enabled"
|
|
echo " [--build_dir] Specify the name of the build folder"
|
|
echo " [--disable-hipsparselt-marker] build without hipsparselt marker"
|
|
echo " [--enable-tensile-marker] build with tensile marker"
|
|
echo " [--keep-build-tmp] do not remove the temporary build artifacts or build_tmp"
|
|
}
|
|
|
|
# This function is helpful for dockerfiles that do not have sudo installed, but the default user is root
|
|
# true is a system command that completes successfully, function returns success
|
|
# prereq: ${ID} must be defined before calling
|
|
supported_distro( )
|
|
{
|
|
if [ -z ${ID+foo} ]; then
|
|
printf "supported_distro(): \$ID must be set\n"
|
|
exit 2
|
|
fi
|
|
|
|
case "${ID}" in
|
|
ubuntu|centos|rhel|fedora|sles|opensuse-leap)
|
|
true
|
|
;;
|
|
*) printf "This script is currently supported on Ubuntu, CentOS, RHEL, Fedora and SLES\n"
|
|
exit 2
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# checks the exit code of the last call, requires exit code to be passed in to the function
|
|
check_exit_code( )
|
|
{
|
|
if (( $1 != 0 )); then
|
|
exit $1
|
|
fi
|
|
}
|
|
|
|
# This function is helpful for dockerfiles that do not have sudo installed, but the default user is root
|
|
elevate_if_not_root( )
|
|
{
|
|
local uid=$(id -u)
|
|
|
|
if (( ${uid} )); then
|
|
sudo $@
|
|
check_exit_code "$?"
|
|
else
|
|
$@
|
|
check_exit_code "$?"
|
|
fi
|
|
}
|
|
|
|
# Take an array of packages as input, and install those packages with 'apt' if they are not already installed
|
|
install_apt_packages( )
|
|
{
|
|
package_dependencies=("$@")
|
|
for package in "${package_dependencies[@]}"; do
|
|
if [[ $(dpkg-query --show --showformat='${db:Status-Abbrev}\n' ${package} 2> /dev/null | grep -q "ii"; echo $?) -ne 0 ]]; then
|
|
printf "\033[32mInstalling \033[33m${package}\033[32m from distro package manager\033[0m\n"
|
|
elevate_if_not_root apt install -y --no-install-recommends ${package}
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Take an array of packages as input, and install those packages with 'yum' if they are not already installed
|
|
install_yum_packages( )
|
|
{
|
|
package_dependencies=("$@")
|
|
for package in "${package_dependencies[@]}"; do
|
|
if [[ $(yum list installed ${package} &> /dev/null; echo $? ) -ne 0 ]]; then
|
|
printf "\033[32mInstalling \033[33m${package}\033[32m from distro package manager\033[0m\n"
|
|
elevate_if_not_root yum -y --nogpgcheck install ${package}
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Take an array of packages as input, and install those packages with 'dnf' if they are not already installed
|
|
install_dnf_packages( )
|
|
{
|
|
package_dependencies=("$@")
|
|
for package in "${package_dependencies[@]}"; do
|
|
if [[ $(dnf list installed ${package} &> /dev/null; echo $? ) -ne 0 ]]; then
|
|
printf "\033[32mInstalling \033[33m${package}\033[32m from distro package manager\033[0m\n"
|
|
elevate_if_not_root dnf install -y ${package}
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Take an array of packages as input, and install those packages with 'zypper' if they are not already installed
|
|
install_zypper_packages( )
|
|
{
|
|
package_dependencies=("$@")
|
|
for package in "${package_dependencies[@]}"; do
|
|
if [[ $(rpm -q ${package} &> /dev/null; echo $? ) -ne 0 ]]; then
|
|
printf "\033[32mInstalling \033[33m${package}\033[32m from distro package manager\033[0m\n"
|
|
elevate_if_not_root zypper -n --no-gpg-checks install ${package}
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Take an array of packages as input, and delegate the work to the appropriate distro installer
|
|
# prereq: ${ID} must be defined before calling
|
|
# prereq: ${build_clients} must be defined before calling
|
|
install_packages( )
|
|
{
|
|
if [ -z ${ID+foo} ]; then
|
|
printf "install_packages(): \$ID must be set\n"
|
|
exit 2
|
|
fi
|
|
|
|
if [ -z ${build_clients+foo} ]; then
|
|
printf "install_packages(): \$build_clients must be set\n"
|
|
exit 2
|
|
fi
|
|
|
|
# dependencies needed for library and clients to build
|
|
local library_dependencies_ubuntu=( "gfortran" "make" "pkg-config" "libnuma1" )
|
|
local library_dependencies_centos=( "epel-release" "make" "gcc-c++" "rpm-build" "devtoolset-7-gcc-gfortran" )
|
|
local library_dependencies_centos8=( "gcc-gfortran" "epel-release" "make" "gcc-c++" "rpm-build" "numactl-libs" )
|
|
local library_dependencies_fedora=( "gcc-gfortran" "make" "cmake" "gcc-c++" "libcxx-devel" "rpm-build" "numactl-libs" )
|
|
local library_dependencies_sles=( "gcc-fortran" "make" "cmake" "gcc-c++" "libcxxtools9" "rpm-build" )
|
|
|
|
local client_dependencies_ubuntu=( "python3" "python3-yaml" "python3-joblib" )
|
|
local client_dependencies_centos=( "python36" "python3-pip" "python3-joblib" )
|
|
local client_dependencies_centos8=( "python39" "python3-pip" )
|
|
local client_dependencies_fedora=( "python36" "PyYAML" "python3-pip" "python3-joblib" )
|
|
local client_dependencies_sles=( "pkg-config" "dpkg" "python3-pip" "python3-joblib" )
|
|
|
|
if [[ ( "${ID}" == "centos" ) || ( "${ID}" == "rhel" ) ]]; then
|
|
if [[ "${VERSION_ID}" == "6" ]]; then
|
|
library_dependencies_centos+=( "numactl" )
|
|
else
|
|
library_dependencies_centos+=( "numactl-libs" )
|
|
fi
|
|
if (( "${VERSION_ID%%.*}" >= "9" )); then
|
|
client_dependencies_centos8+=( "python3-pyyaml" )
|
|
else
|
|
if (( "${VERSION_ID%%.*}" >= "8" )); then
|
|
client_dependencies_centos8+=( "python3-pyyaml" "python3-joblib" )
|
|
else
|
|
client_dependencies_centos8+=( "PyYAML" )
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [[ "${tensile_msgpack_backend}" == true ]]; then
|
|
client_dependencies_ubuntu+=("libmsgpack-dev")
|
|
client_dependencies_fedora+=("msgpack-devel")
|
|
fi
|
|
|
|
# wget is needed for blis
|
|
if [[ ! -e "${build_dir}/deps/blis/lib/libblis.a" ]]; then
|
|
client_dependencies_ubuntu+=("wget")
|
|
client_dependencies_centos_rhel+=("wget")
|
|
client_dependencies_centos_rhel_8+=("wget")
|
|
client_dependencies_fedora+=("wget")
|
|
client_dependencies_sles+=("wget")
|
|
fi
|
|
|
|
# wget is needed for msgpack in this case
|
|
if [[ ("${ID}" == "ubuntu") && ("${VERSION_ID}" == "16.04") && "${tensile_msgpack_backend}" == true ]]; then
|
|
if ! $(dpkg -s "libmsgpackc2" &> /dev/null) || $(dpkg --compare-versions $(dpkg-query -f='${Version}' --show libmsgpackc2) lt 2.1.5-1); then
|
|
library_dependencies_ubuntu+=("wget")
|
|
fi
|
|
fi
|
|
|
|
case "${ID}" in
|
|
ubuntu)
|
|
elevate_if_not_root apt update
|
|
install_apt_packages "${library_dependencies_ubuntu[@]}"
|
|
|
|
if [[ "${build_clients}" == true ]]; then
|
|
install_apt_packages "${client_dependencies_ubuntu[@]}"
|
|
fi
|
|
;;
|
|
|
|
centos|rhel)
|
|
# yum -y update brings *all* installed packages up to date
|
|
# without seeking user approval
|
|
# elevate_if_not_root yum -y update
|
|
if (( "${VERSION_ID%%.*}" >= "8" )); then
|
|
install_yum_packages "${library_dependencies_centos8[@]}"
|
|
if [[ "${build_clients}" == true ]]; then
|
|
install_yum_packages "${client_dependencies_centos8[@]}"
|
|
pip3 install pyyaml
|
|
fi
|
|
else
|
|
install_yum_packages "${library_dependencies_centos[@]}"
|
|
if [[ "${build_clients}" == true ]]; then
|
|
install_yum_packages "${client_dependencies_centos[@]}"
|
|
pip3 install pyyaml
|
|
fi
|
|
fi
|
|
;;
|
|
|
|
fedora)
|
|
# elevate_if_not_root dnf -y update
|
|
install_dnf_packages "${library_dependencies_fedora[@]}"
|
|
|
|
if [[ "${build_clients}" == true ]]; then
|
|
install_dnf_packages "${client_dependencies_fedora[@]}"
|
|
pip3 install pyyaml
|
|
fi
|
|
;;
|
|
|
|
sles|opensuse-leap)
|
|
# elevate_if_not_root zypper -y update
|
|
install_zypper_packages "${library_dependencies_sles[@]}"
|
|
|
|
if [[ "${build_clients}" == true ]]; then
|
|
install_zypper_packages "${client_dependencies_sles[@]}"
|
|
pip3 install pyyaml
|
|
fi
|
|
;;
|
|
*)
|
|
echo "This script is currently supported on Ubuntu, SLES, CentOS, RHEL and Fedora"
|
|
exit 2
|
|
;;
|
|
esac
|
|
|
|
}
|
|
|
|
install_msgpack_from_source( )
|
|
{
|
|
if [[ ! -d "${build_dir}/deps/msgpack-c" ]]; then
|
|
pushd .
|
|
mkdir -p ${build_dir}/deps
|
|
cd ${build_dir}/deps
|
|
git clone -b cpp-3.1.0 https://github.com/msgpack/msgpack-c.git
|
|
cd msgpack-c
|
|
CXX=${cxx} CC=${cc} ${cmake_executable} -DMSGPACK_BUILD_TESTS=OFF -DMSGPACK_BUILD_EXAMPLES=OFF .
|
|
make
|
|
elevate_if_not_root make install
|
|
popd
|
|
fi
|
|
}
|
|
|
|
# #################################################
|
|
# Pre-requisites check
|
|
# #################################################
|
|
# Exit code 0: alls well
|
|
# Exit code 1: problems with getopt
|
|
# Exit code 2: problems with supported platforms
|
|
|
|
# check if getopt command is installed
|
|
type getopt > /dev/null
|
|
if [[ $? -ne 0 ]]; then
|
|
echo "This script uses getopt to parse arguments; try installing the util-linux package";
|
|
exit 1
|
|
fi
|
|
|
|
# os-release file describes the system
|
|
if [[ -e "/etc/os-release" ]]; then
|
|
source /etc/os-release
|
|
else
|
|
echo "This script depends on the /etc/os-release file"
|
|
exit 2
|
|
fi
|
|
|
|
# The following function exits script if an unsupported distro is detected
|
|
supported_distro
|
|
|
|
# #################################################
|
|
# global variables
|
|
# #################################################
|
|
install_package=false
|
|
install_dependencies=false
|
|
build_clients=false
|
|
build_release=true
|
|
build_cuda=false
|
|
build_amd_clang=true
|
|
compiler=g++
|
|
compiler_c=cc
|
|
build_static=false
|
|
build_release_debug=false
|
|
build_codecoverage=false
|
|
install_prefix=hipsparselt-install
|
|
rocm_path=/opt/rocm
|
|
build_relocatable=false
|
|
build_address_sanitizer=false
|
|
gpu_architecture=all
|
|
cpu_ref_lib=blis
|
|
tensile_cov=4
|
|
tensile_fork=
|
|
tensile_merge_files=
|
|
tensile_tag=
|
|
tensile_test_local_path=
|
|
tensile_version=
|
|
build_tensile=true
|
|
tensile_msgpack_backend=true
|
|
build_dir_user=build
|
|
tensile_no_lazy_library_loading=false
|
|
disable_hipsparselt_marker=false
|
|
enable_tensile_marker=false
|
|
blis_dir=
|
|
keep_build_tmp=false
|
|
|
|
if ! [ -z ${ROCM_PATH+x} ]; then
|
|
rocm_path=${ROCM_PATH}
|
|
fi
|
|
|
|
# #################################################
|
|
# Parameter parsing
|
|
# #################################################
|
|
|
|
# check if we have a modern version of getopt that can handle whitespace and long parameters
|
|
getopt -T
|
|
if [[ $? -eq 4 ]]; then
|
|
GETOPT_PARSE=$(getopt --name "${0}" --longoptions help,install,clients,dependencies,debug,cuda,use-cuda,static,relocatable,codecoverage,relwithdebinfo,address-sanitizer,architecture:,cpu_ref_lib:,logic:,cov:,fork:,branch:,test_local_path:,use-custom-version:,build_dir:,disable-hipsparselt-marker,enable-tensile-marker,keep-build-tmp --options hicdgrkl:o:f:b:t:nu::a: -- "$@")
|
|
else
|
|
echo "Need a new version of getopt"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ $? -ne 0 ]]; then
|
|
echo "getopt invocation failed; could not parse the command line";
|
|
exit 1
|
|
fi
|
|
|
|
eval set -- "${GETOPT_PARSE}"
|
|
|
|
while true; do
|
|
case "${1}" in
|
|
-h|--help)
|
|
display_help
|
|
exit 0
|
|
;;
|
|
-i|--install)
|
|
install_package=true
|
|
shift ;;
|
|
-d|--dependencies)
|
|
install_dependencies=true
|
|
shift ;;
|
|
-c|--clients)
|
|
build_clients=true
|
|
shift ;;
|
|
-r|--relocatable)
|
|
build_relocatable=true
|
|
shift ;;
|
|
-g|--debug)
|
|
build_release=false
|
|
shift ;;
|
|
--cuda|--use-cuda)
|
|
build_cuda=true
|
|
build_amd_clang=false
|
|
shift ;;
|
|
--static)
|
|
build_static=true
|
|
shift ;;
|
|
--address-sanitizer)
|
|
build_address_sanitizer=true
|
|
compiler=amdclang++
|
|
shift ;;
|
|
-k|--relwithdebinfo)
|
|
build_release=false
|
|
build_release_debug=true
|
|
shift ;;
|
|
--codecoverage)
|
|
build_codecoverage=true
|
|
shift ;;
|
|
-a|--architecture)
|
|
gpu_architecture=${2}
|
|
shift 2 ;;
|
|
--cpu_ref_lib)
|
|
cpu_ref_lib=${2}
|
|
shift 2 ;;
|
|
--prefix)
|
|
install_prefix=${2}
|
|
shift 2 ;;
|
|
-l|--logic)
|
|
tensile_logic=${2}
|
|
shift 2 ;;
|
|
-o|--cov)
|
|
tensile_cov=${2}
|
|
shift 2 ;;
|
|
-f|--fork)
|
|
tensile_fork=${2}
|
|
shift 2 ;;
|
|
-b|--branch)
|
|
tensile_tag=${2}
|
|
shift 2 ;;
|
|
-t|--test_local_path)
|
|
tensile_test_local_path=${2}
|
|
shift 2 ;;
|
|
-n|--no_tensile|--no-tensile)
|
|
build_tensile=false
|
|
shift ;;
|
|
--merge-files)
|
|
tensile_merge_files=true
|
|
shift ;;
|
|
-no-merge-files)
|
|
tensile_merge_files=false
|
|
shift 2;;
|
|
-u|--use-custom-version)
|
|
tensile_version=${2}
|
|
shift 2;;
|
|
--msgpack)
|
|
tensile_msgpack_backend=true
|
|
shift ;;
|
|
--no-msgpack)
|
|
tensile_msgpack_backend=false
|
|
shift ;;
|
|
--build_dir)
|
|
build_dir_user=${2}
|
|
shift 2;;
|
|
--keep-build-tmp)
|
|
keep_build_tmp=true
|
|
shift ;;
|
|
--disable-hipsparselt-marker)
|
|
disable_hipsparselt_marker=true
|
|
shift ;;
|
|
--enable-tensile-marker)
|
|
enable_tensile_marker=true
|
|
shift ;;
|
|
--) shift ; break ;;
|
|
*) echo "Unexpected command line parameter received: '${1}'; aborting";
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z $tensile_cov ]]; then
|
|
tensile_cov=4
|
|
fi
|
|
|
|
if [[ "${cpu_ref_lib}" == blis ]]; then
|
|
LINK_BLIS=true
|
|
elif [[ "${cpu_ref_lib}" == lapack ]]; then
|
|
LINK_BLIS=false
|
|
else
|
|
echo "Currently the only CPU library options are blis and lapack"
|
|
exit 2
|
|
fi
|
|
|
|
build_dir=$(readlink -m ${build_dir_user})
|
|
|
|
printf "\033[32mCreating project build directory in: \033[33m${build_dir}\033[0m\n"
|
|
|
|
install_blis()
|
|
{
|
|
if [[ ! -e "/opt/AMD/aocl/aocl-linux-gcc-4.2.0/gcc/lib_ILP64/libblis-mt.a" ]] &&
|
|
[[ ! -e "/opt/AMD/aocl/aocl-linux-aocc-4.1.0/aocc/lib_ILP64/libblis-mt.a" ]] &&
|
|
[[ ! -e "/opt/AMD/aocl/aocl-linux-aocc-4.0/lib_ILP64/libblis-mt.a" ]] &&
|
|
[[ ! -e "/usr/local/lib/libblis.a" ]]; then
|
|
#Download prebuilt AMD multithreaded blis
|
|
if [[ ! -e "${build_dir}/deps/blis/lib/libblis.a" ]]; then
|
|
case "${ID}" in
|
|
centos|rhel|sles|opensuse-leap)
|
|
wget -nv -O blis.tar.gz https://github.com/amd/blis/releases/download/2.0/aocl-blis-mt-centos-2.0.tar.gz
|
|
;;
|
|
ubuntu)
|
|
wget -nv -O blis.tar.gz https://github.com/amd/blis/releases/download/2.0/aocl-blis-mt-ubuntu-2.0.tar.gz
|
|
;;
|
|
*)
|
|
echo "Unsupported OS for this script"
|
|
wget -nv -O blis.tar.gz https://github.com/amd/blis/releases/download/2.0/aocl-blis-mt-ubuntu-2.0.tar.gz
|
|
;;
|
|
esac
|
|
|
|
tar -xvf blis.tar.gz
|
|
rm -rf blis/amd-blis-mt
|
|
mv amd-blis-mt blis
|
|
rm blis.tar.gz
|
|
cd blis/lib
|
|
ln -sf libblis-mt.a libblis.a
|
|
fi
|
|
blis_dir=${build_dir}
|
|
fi
|
|
}
|
|
|
|
# #################################################
|
|
# prep
|
|
# #################################################
|
|
# ensure a clean build environment
|
|
if [[ "${build_release}" == true ]]; then
|
|
rm -rf ${build_dir}/release
|
|
elif [[ "${build_release_debug}" == true ]]; then
|
|
rm -rf ${build_dir}/release-debug
|
|
else
|
|
rm -rf ${build_dir}/debug
|
|
fi
|
|
|
|
# Default cmake executable is called cmake
|
|
cmake_executable=cmake
|
|
|
|
# If user provides custom ${rocm_path} path for hcc it has lesser priority,
|
|
# but with amd-clang existing path has lesser priority to avoid use of installed clang++
|
|
if [[ "${build_amd_clang}" == true ]]; then
|
|
export PATH=${rocm_path}/bin:${rocm_path}/hip/bin:${rocm_path}/llvm/bin:${PATH}
|
|
fi
|
|
|
|
# #################################################
|
|
# dependencies
|
|
# #################################################
|
|
if [[ "${install_dependencies}" == true ]]; then
|
|
|
|
install_packages
|
|
|
|
# cmake is needed to install msgpack
|
|
case "${ID}" in
|
|
centos|rhel|sles|opensuse-leap)
|
|
if [[ "${tensile_msgpack_backend}" == true ]]; then
|
|
install_msgpack_from_source
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Note: googletest is now automatically fetched and built via FetchContent in CMake
|
|
# No manual installation needed
|
|
fi
|
|
|
|
if [[ "${build_relocatable}" == true ]]; then
|
|
if ! [ -z ${ROCM_PATH+x} ]; then
|
|
rocm_path=${ROCM_PATH}
|
|
fi
|
|
|
|
rocm_rpath=" -Wl,--enable-new-dtags -Wl,--rpath,/opt/rocm/lib:/opt/rocm/lib64"
|
|
if ! [ -z ${ROCM_RPATH+x} ]; then
|
|
rocm_rpath=" -Wl,--enable-new-dtags -Wl,--rpath,${ROCM_RPATH}"
|
|
fi
|
|
fi
|
|
|
|
# We append customary rocm path; if user provides custom rocm path in ${path}, our
|
|
# hard-coded path has lesser priority
|
|
if [[ "${build_relocatable}" == true ]]; then
|
|
export PATH=${rocm_path}/bin:${PATH}
|
|
else
|
|
export PATH=${PATH}:/opt/rocm/bin
|
|
fi
|
|
|
|
pushd .
|
|
# #################################################
|
|
# configure & build
|
|
# #################################################
|
|
cmake_common_options="-DGPU_TARGETS=${gpu_architecture}"
|
|
if [[ "${install_dependencies}" == true ]]; then
|
|
cmake_common_options="${cmake_common_options} -DHIPSPARSELT_ENABLE_FETCH=ON"
|
|
fi
|
|
|
|
cmake_client_options=""
|
|
|
|
# build type
|
|
if [[ "${build_release}" == true ]]; then
|
|
mkdir -p ${build_dir}/release/clients && cd ${build_dir}/release
|
|
cmake_common_options="${cmake_common_options} -DCMAKE_BUILD_TYPE=Release"
|
|
elif [[ "${build_release_debug}" == true ]]; then
|
|
mkdir -p ${build_dir}/release-debug/clients && cd ${build_dir}/release-debug
|
|
cmake_common_options="${cmake_common_options} -DCMAKE_BUILD_TYPE=RelWithDebInfo"
|
|
else
|
|
mkdir -p ${build_dir}/debug/clients && cd ${build_dir}/debug
|
|
cmake_common_options="${cmake_common_options} -DCMAKE_BUILD_TYPE=Debug"
|
|
fi
|
|
|
|
# cuda
|
|
if [[ "${build_cuda}" == true ]]; then
|
|
cmake_common_options="${cmake_common_options} -DHIPSPARSELT_ENABLE_CUDA=ON"
|
|
else
|
|
cmake_common_options="${cmake_common_options} -DHIPSPARSELT_ENABLE_CUDA=OFF"
|
|
fi
|
|
|
|
|
|
# address sanitizer
|
|
if [[ "${build_address_sanitizer}" == true ]]; then
|
|
cmake_common_options="${cmake_common_options} -DHIPSPARSELT_ENABLE_ASAN=ON"
|
|
fi
|
|
|
|
# code coverage
|
|
if [[ "${build_codecoverage}" == true ]]; then
|
|
# Note: build system rejects code coverage if not in debug mode
|
|
cmake_common_options="${cmake_common_options} -DHIPSPARSELT_BUILD_COVERAGE=ON"
|
|
fi
|
|
|
|
# library type
|
|
if [[ "${build_static}" == true ]]; then
|
|
if [[ "${build_cuda}" == true ]]; then
|
|
printf "Static library not supported for CUDA backend.\n"
|
|
exit 1
|
|
fi
|
|
cmake_common_options="${cmake_common_options} -DHIPSPARSELT_BUILD_SHARED_LIBS=OFF"
|
|
compiler="${rocm_path}/bin/amdclang++" #force amdclang++ for static libs, g++ doesn't work
|
|
compiler_c="${rocm_path}/bin/amdclang"
|
|
printf "Forcing compiler to amdclang++ for static library.\n"
|
|
fi
|
|
|
|
# clients
|
|
if [[ "${build_clients}" == true ]]; then
|
|
pushd .
|
|
mkdir -p ${build_dir}/deps && cd ${build_dir}/deps
|
|
install_blis
|
|
popd
|
|
cmake_client_options="${cmake_client_options} -DHIPSPARSELT_ENABLE_SAMPLES=ON -DHIPSPARSELT_BUILD_TESTING=ON -DHIPSPARSELT_ENABLE_BENCHMARKS=ON -DHIPSPARSELT_ENABLE_BLIS=${LINK_BLIS}"
|
|
if [[ -n "${blis_dir}" ]]; then
|
|
cmake_common_options="${cmake_common_options} -DHIPSPARSELT_BLIS_DIR=${blis_dir}"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "${tensile_fork}" ]]; then
|
|
cmake_common_options="${cmake_common_options} -Dtensile_fork=${tensile_fork}"
|
|
fi
|
|
|
|
if [[ -n "${tensile_tag}" ]]; then
|
|
cmake_common_options="${cmake_common_options} -Dtensile_tag=${tensile_tag}"
|
|
fi
|
|
|
|
if [[ -n "${tensile_test_local_path}" ]]; then
|
|
cmake_common_options="${cmake_common_options} -DTensile_TEST_LOCAL_PATH=${tensile_test_local_path}"
|
|
fi
|
|
|
|
if [[ -n "${tensile_version}" ]]; then
|
|
cmake_common_options="${cmake_common_options} -DTENSILE_VERSION=${tensile_version}"
|
|
fi
|
|
|
|
tensile_opt=""
|
|
if [[ "${build_tensile}" == false ]]; then
|
|
printf "Building hipsparselt with tensile is no longer supported.\n"
|
|
exit 1
|
|
else
|
|
tensile_opt="${tensile_opt} -DHIPSPARSELT_ENABLE_HIP=ON"
|
|
tensile_opt="${tensile_opt} -DTENSILELITE_LIBLOGIC_PATH=${tensile_logic}"
|
|
if [[ ${build_jobs} != $(nproc) ]]; then
|
|
tensile_opt="${tensile_opt} -DTENSILELITE_BUILD_PARALLEL_LEVEL=${build_jobs}"
|
|
fi
|
|
fi
|
|
|
|
if [[ "${tensile_merge_files}" == false ]]; then
|
|
tensile_opt="${tensile_opt} -DTensile_MERGE_FILES=OFF"
|
|
fi
|
|
|
|
if [[ "${tensile_msgpack_backend}" == true ]]; then
|
|
tensile_opt="${tensile_opt} -DTENSILELITE_LIBRARY_FORMAT=msgpack"
|
|
else
|
|
tensile_opt="${tensile_opt} -DTENSILELITE_LIBRARY_FORMAT=yaml"
|
|
fi
|
|
if [[ "${tensile_no_lazy_library_loading}" == true ]]; then
|
|
tensile_opt="${tensile_opt} -DTensile_NO_LAZY_LIBRARY_LOADING=ON"
|
|
fi
|
|
|
|
if [[ "${disable_hipsparselt_marker}" == true ]]; then
|
|
tensile_opt="${tensile_opt} -DHIPSPARSELT_ENABLE_MARKER=OFF"
|
|
fi
|
|
|
|
if [[ "${keep_build_tmp}" == true ]]; then
|
|
tensile_opt="${tensile_opt} -DTENSILELITE_KEEP_BUILD_TMP=ON"
|
|
fi
|
|
|
|
echo $cmake_common_options
|
|
cmake_common_options="${cmake_common_options} ${tensile_opt}"
|
|
|
|
if [[ "${build_amd_clang}" == true ]]; then
|
|
compiler="${rocm_path}/bin/amdclang++"
|
|
compiler_c="${rocm_path}/bin/amdclang"
|
|
fi
|
|
|
|
if [[ "${build_clients}" == false ]]; then
|
|
cmake_client_options=""
|
|
fi
|
|
|
|
# Build library with AMD toolchain because of existense of device kernels
|
|
printf "CMAKE CONFIGURE COMMAND: \n"
|
|
set -x
|
|
if [[ "${build_relocatable}" == true ]]; then
|
|
FC=gfortran CXX=${compiler} CC=${compiler_c} ${cmake_executable} ${cmake_common_options} ${cmake_client_options} -DCPACK_SET_DESTDIR=OFF \
|
|
-DCMAKE_INSTALL_PREFIX=${install_prefix} \
|
|
-DCPACK_PACKAGING_INSTALL_PREFIX=${rocm_path} \
|
|
-DCMAKE_SHARED_LINKER_FLAGS="${rocm_rpath}" \
|
|
-DCMAKE_PREFIX_PATH="${rocm_path} ${rocm_path}/hcc ${rocm_path}/hip" \
|
|
-DCMAKE_MODULE_PATH="${rocm_path}/hip/cmake" \
|
|
-DROCM_DISABLE_LDCONFIG=ON \
|
|
-DROCM_PATH="${rocm_path}" ../..
|
|
else
|
|
FC=gfortran CXX=${compiler} CC=${compiler_c} ${cmake_executable} ${cmake_common_options} ${cmake_client_options} -DCPACK_SET_DESTDIR=OFF -DCMAKE_INSTALL_PREFIX=${install_prefix} -DCMAKE_PREFIX_PATH="${rocm_path}" -DCPACK_PACKAGING_INSTALL_PREFIX=${rocm_path} -DROCM_PATH="${rocm_path}" ../..
|
|
fi
|
|
set +x
|
|
|
|
check_exit_code "$?"
|
|
|
|
make -j$(nproc) install VERBOSE=1
|
|
check_exit_code "$?"
|
|
|
|
# #################################################
|
|
# install
|
|
# #################################################
|
|
# installing through package manager, which makes uninstalling easy
|
|
if [[ "${install_package}" == true ]]; then
|
|
make package
|
|
check_exit_code "$?"
|
|
|
|
case "${ID}" in
|
|
ubuntu)
|
|
elevate_if_not_root dpkg -i hipsparselt[-\_]*.deb
|
|
;;
|
|
centos|rhel)
|
|
# hipblaslt-style: upgrade the locally-built RPMs without dependency solving.
|
|
# This avoids conflicts with pinned ROCm meta-packages (e.g. rocm-hip) in CI images.
|
|
elevate_if_not_root rpm --nodeps -U hipsparselt-*.rpm
|
|
;;
|
|
fedora)
|
|
elevate_if_not_root dnf install hipsparselt-*.rpm
|
|
;;
|
|
sles|opensuse-leap)
|
|
elevate_if_not_root zypper -n --no-gpg-checks install hipsparselt-*.rpm
|
|
;;
|
|
esac
|
|
|
|
fi
|
|
popd
|