1#!/bin/bash 2# Script used only in CD pipeline 3 4set -ex 5 6ROCM_VERSION=$1 7 8if [[ -z $ROCM_VERSION ]]; then 9 echo "missing ROCM_VERSION" 10 exit 1; 11fi 12 13IS_UBUNTU=0 14ID=$(grep -oP '(?<=^ID=).+' /etc/os-release | tr -d '"') 15case "$ID" in 16 ubuntu) 17 IS_UBUNTU=1 18 ;; 19 centos) 20 IS_UBUNTU=0 21 ;; 22 *) 23 echo "Unable to determine OS..." 24 exit 1 25 ;; 26esac 27 28# To make version comparison easier, create an integer representation. 29save_IFS="$IFS" 30IFS=. ROCM_VERSION_ARRAY=(${ROCM_VERSION}) 31IFS="$save_IFS" 32if [[ ${#ROCM_VERSION_ARRAY[@]} == 2 ]]; then 33 ROCM_VERSION_MAJOR=${ROCM_VERSION_ARRAY[0]} 34 ROCM_VERSION_MINOR=${ROCM_VERSION_ARRAY[1]} 35 ROCM_VERSION_PATCH=0 36elif [[ ${#ROCM_VERSION_ARRAY[@]} == 3 ]]; then 37 ROCM_VERSION_MAJOR=${ROCM_VERSION_ARRAY[0]} 38 ROCM_VERSION_MINOR=${ROCM_VERSION_ARRAY[1]} 39 ROCM_VERSION_PATCH=${ROCM_VERSION_ARRAY[2]} 40else 41 echo "Unhandled ROCM_VERSION ${ROCM_VERSION}" 42 exit 1 43fi 44ROCM_INT=$(($ROCM_VERSION_MAJOR * 10000 + $ROCM_VERSION_MINOR * 100 + $ROCM_VERSION_PATCH)) 45 46# Install custom MIOpen + COMgr for ROCm >= 4.0.1 47if [[ $ROCM_INT -lt 40001 ]]; then 48 echo "ROCm version < 4.0.1; will not install custom MIOpen" 49 exit 0 50fi 51 52# Function to retry functions that sometimes timeout or have flaky failures 53retry () { 54 $* || (sleep 1 && $*) || (sleep 2 && $*) || (sleep 4 && $*) || (sleep 8 && $*) 55} 56 57# Build custom MIOpen to use comgr for offline compilation. 58 59## Need a sanitized ROCM_VERSION without patchlevel; patchlevel version 0 must be added to paths. 60ROCM_DOTS=$(echo ${ROCM_VERSION} | tr -d -c '.' | wc -c) 61if [[ ${ROCM_DOTS} == 1 ]]; then 62 ROCM_VERSION_NOPATCH="${ROCM_VERSION}" 63 ROCM_INSTALL_PATH="/opt/rocm-${ROCM_VERSION}.0" 64else 65 ROCM_VERSION_NOPATCH="${ROCM_VERSION%.*}" 66 ROCM_INSTALL_PATH="/opt/rocm-${ROCM_VERSION}" 67fi 68 69# MIOPEN_USE_HIP_KERNELS is a Workaround for COMgr issues 70MIOPEN_CMAKE_COMMON_FLAGS=" 71-DMIOPEN_USE_COMGR=ON 72-DMIOPEN_BUILD_DRIVER=OFF 73" 74# Pull MIOpen repo and set DMIOPEN_EMBED_DB based on ROCm version 75if [[ $ROCM_INT -ge 60200 ]] && [[ $ROCM_INT -lt 60300 ]]; then 76 MIOPEN_BRANCH="release/rocm-rel-6.2-staging" 77elif [[ $ROCM_INT -ge 60100 ]] && [[ $ROCM_INT -lt 60200 ]]; then 78 echo "ROCm 6.1 MIOpen does not need any patches, do not build from source" 79 exit 0 80elif [[ $ROCM_INT -ge 60000 ]] && [[ $ROCM_INT -lt 60100 ]]; then 81 echo "ROCm 6.0 MIOpen does not need any patches, do not build from source" 82 exit 0 83elif [[ $ROCM_INT -ge 50700 ]] && [[ $ROCM_INT -lt 60000 ]]; then 84 echo "ROCm 5.7 MIOpen does not need any patches, do not build from source" 85 exit 0 86elif [[ $ROCM_INT -ge 50600 ]] && [[ $ROCM_INT -lt 50700 ]]; then 87 MIOPEN_BRANCH="release/rocm-rel-5.6-staging" 88elif [[ $ROCM_INT -ge 50500 ]] && [[ $ROCM_INT -lt 50600 ]]; then 89 MIOPEN_BRANCH="release/rocm-rel-5.5-gfx11" 90elif [[ $ROCM_INT -ge 50400 ]] && [[ $ROCM_INT -lt 50500 ]]; then 91 MIOPEN_CMAKE_DB_FLAGS="-DMIOPEN_EMBED_DB=gfx900_56;gfx906_60;gfx90878;gfx90a6e;gfx1030_36 -DMIOPEN_USE_MLIR=Off" 92 MIOPEN_BRANCH="release/rocm-rel-5.4-staging" 93elif [[ $ROCM_INT -ge 50300 ]] && [[ $ROCM_INT -lt 50400 ]]; then 94 MIOPEN_CMAKE_DB_FLAGS="-DMIOPEN_EMBED_DB=gfx900_56;gfx906_60;gfx90878;gfx90a6e;gfx1030_36 -DMIOPEN_USE_MLIR=Off" 95 MIOPEN_BRANCH="release/rocm-rel-5.3-staging" 96elif [[ $ROCM_INT -ge 50200 ]] && [[ $ROCM_INT -lt 50300 ]]; then 97 MIOPEN_CMAKE_DB_FLAGS="-DMIOPEN_EMBED_DB=gfx900_56;gfx906_60;gfx90878;gfx90a6e;gfx1030_36 -DMIOPEN_USE_MLIR=Off" 98 MIOPEN_BRANCH="release/rocm-rel-5.2-staging" 99elif [[ $ROCM_INT -ge 50100 ]] && [[ $ROCM_INT -lt 50200 ]]; then 100 MIOPEN_CMAKE_DB_FLAGS="-DMIOPEN_EMBED_DB=gfx900_56;gfx906_60;gfx90878;gfx90a6e;gfx1030_36" 101 MIOPEN_BRANCH="release/rocm-rel-5.1-staging" 102elif [[ $ROCM_INT -ge 50000 ]] && [[ $ROCM_INT -lt 50100 ]]; then 103 MIOPEN_CMAKE_DB_FLAGS="-DMIOPEN_EMBED_DB=gfx900_56;gfx906_60;gfx90878;gfx90a6e;gfx1030_36" 104 MIOPEN_BRANCH="release/rocm-rel-5.0-staging" 105else 106 echo "Unhandled ROCM_VERSION ${ROCM_VERSION}" 107 exit 1 108fi 109 110 111if [[ ${IS_UBUNTU} == 1 ]]; then 112 apt-get remove -y miopen-hip 113else 114 yum remove -y miopen-hip 115fi 116 117git clone https://github.com/ROCm/MIOpen -b ${MIOPEN_BRANCH} 118pushd MIOpen 119# remove .git to save disk space since CI runner was running out 120rm -rf .git 121# Don't build CK to save docker build time 122if [[ $ROCM_INT -ge 60200 ]]; then 123 sed -i '/composable_kernel/d' requirements.txt 124fi 125# Don't build MLIR to save docker build time 126# since we are disabling MLIR backend for MIOpen anyway 127if [[ $ROCM_INT -ge 50400 ]] && [[ $ROCM_INT -lt 50500 ]]; then 128 sed -i '/rocMLIR/d' requirements.txt 129elif [[ $ROCM_INT -ge 50200 ]] && [[ $ROCM_INT -lt 50400 ]]; then 130 sed -i '/llvm-project-mlir/d' requirements.txt 131fi 132## MIOpen minimum requirements 133cmake -P install_deps.cmake --minimum 134 135# clean up since CI runner was running out of disk space 136rm -rf /tmp/* 137if [[ ${IS_UBUNTU} == 1 ]]; then 138 apt-get autoclean && apt-get clean 139 rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 140else 141 yum clean all 142 rm -rf /var/cache/yum 143 rm -rf /var/lib/yum/yumdb 144 rm -rf /var/lib/yum/history 145fi 146 147## Build MIOpen 148mkdir -p build 149cd build 150PKG_CONFIG_PATH=/usr/local/lib/pkgconfig CXX=${ROCM_INSTALL_PATH}/llvm/bin/clang++ cmake .. \ 151 ${MIOPEN_CMAKE_COMMON_FLAGS} \ 152 ${MIOPEN_CMAKE_DB_FLAGS} \ 153 -DCMAKE_PREFIX_PATH="${ROCM_INSTALL_PATH}/hip;${ROCM_INSTALL_PATH}" 154make MIOpen -j $(nproc) 155 156# Build MIOpen package 157make -j $(nproc) package 158 159# clean up since CI runner was running out of disk space 160rm -rf /usr/local/cget 161 162if [[ ${IS_UBUNTU} == 1 ]]; then 163 sudo dpkg -i miopen-hip*.deb 164else 165 yum install -y miopen-*.rpm 166fi 167 168popd 169rm -rf MIOpen 170