1*89928cc5SHong Zhang#!/bin/bash 2*89928cc5SHong Zhang 3*89928cc5SHong Zhang# Before running this script, make sure set up the directory for storing the downloaded matrix files (ARCHIVE_LOCATION) 4*89928cc5SHong ZhangARCHIVE_LOCATION="" 5*89928cc5SHong ZhangSSGET=./ssget 6*89928cc5SHong Zhang 7*89928cc5SHong Zhangif [ ! "${BENCHMARK}" ]; then 8*89928cc5SHong Zhang BENCHMARK="spmv" 9*89928cc5SHong Zhang echo "BENCHMARK environment variable not set - assuming \"${BENCHMARK}\"" 1>&2 10*89928cc5SHong Zhangfi 11*89928cc5SHong Zhang 12*89928cc5SHong Zhangif [ ! "${DRY_RUN}" ]; then 13*89928cc5SHong Zhang DRY_RUN="false" 14*89928cc5SHong Zhang echo "DRY_RUN environment variable not set - assuming \"${DRY_RUN}\"" 1>&2 15*89928cc5SHong Zhangfi 16*89928cc5SHong Zhang 17*89928cc5SHong Zhangif [ ! "${EXECUTOR}" ]; then 18*89928cc5SHong Zhang EXECUTOR="cuda" 19*89928cc5SHong Zhang echo "EXECUTOR environment variable not set - assuming \"${EXECUTOR}\"" 1>&2 20*89928cc5SHong Zhangfi 21*89928cc5SHong Zhang 22*89928cc5SHong Zhangif [ ! "${SEGMENTS}" ]; then 23*89928cc5SHong Zhang echo "SEGMENTS environment variable not set - running entire suite" 1>&2 24*89928cc5SHong Zhang SEGMENTS=1 25*89928cc5SHong Zhang SEGMENT_ID=1 26*89928cc5SHong Zhangelif [ ! "${SEGMENT_ID}" ]; then 27*89928cc5SHong Zhang echo "SEGMENT_ID environment variable not set - exiting" 1>&2 28*89928cc5SHong Zhang exit 1 29*89928cc5SHong Zhangfi 30*89928cc5SHong Zhang 31*89928cc5SHong Zhangif [ ! "${FORMATS}" ]; then 32*89928cc5SHong Zhang echo "FORMATS environment variable not set - assuming \"csr\"" 1>&2 33*89928cc5SHong Zhang FORMATS="csr" 34*89928cc5SHong Zhangfi 35*89928cc5SHong Zhang 36*89928cc5SHong Zhangif [ ! "${DEVICE_ID}" ]; then 37*89928cc5SHong Zhang DEVICE_ID="0" 38*89928cc5SHong Zhang echo "DEVICE_ID environment variable not set - assuming \"${DEVICE_ID}\"" 1>&2 39*89928cc5SHong Zhangfi 40*89928cc5SHong Zhang 41*89928cc5SHong Zhangif [ ! "${SINGLE_JSON}" ]; then 42*89928cc5SHong Zhang SINGLE_JSON="false" 43*89928cc5SHong Zhang echo "SINGLE_JSON environment variable not set - assuming \"${SINGLE_JSONR}\"" 1>&2 44*89928cc5SHong Zhangfi 45*89928cc5SHong Zhang 46*89928cc5SHong Zhangif [ ! "${LAUNCHER}" ]; then 47*89928cc5SHong Zhang LAUNCHER="" 48*89928cc5SHong Zhang echo "LAUNCHER environment variable not set - assuming \"${LAUNCHER}\"" 1>&2 49*89928cc5SHong Zhangfi 50*89928cc5SHong Zhang 51*89928cc5SHong Zhang# This allows using a matrix list file for benchmarking. 52*89928cc5SHong Zhang# The file should contains a suitesparse matrix on each line. 53*89928cc5SHong Zhang# The allowed formats to target suitesparse matrix is: 54*89928cc5SHong Zhang# id or group/name or name. 55*89928cc5SHong Zhang# Example: 56*89928cc5SHong Zhang# 1903 57*89928cc5SHong Zhang# Freescale/circuit5M 58*89928cc5SHong Zhang# thermal2 59*89928cc5SHong Zhangif [ ! "${MATRIX_LIST_FILE}" ]; then 60*89928cc5SHong Zhang use_matrix_list_file=0 61*89928cc5SHong Zhangelif [ -f "${MATRIX_LIST_FILE}" ]; then 62*89928cc5SHong Zhang use_matrix_list_file=1 63*89928cc5SHong Zhangelse 64*89928cc5SHong Zhang echo -e "A matrix list file was set to ${MATRIX_LIST_FILE} but it cannot be found." 65*89928cc5SHong Zhang exit 1 66*89928cc5SHong Zhangfi 67*89928cc5SHong Zhang 68*89928cc5SHong Zhang# Runs the SpMV benchmarks for all SpMV formats by using file $1 as the input, 69*89928cc5SHong Zhang# and updating it with the results. Backups are created after each 70*89928cc5SHong Zhang# benchmark run, to prevent data loss in case of a crash. Once the benchmarking 71*89928cc5SHong Zhang# is completed, the backups and the results are combined, and the newest file is 72*89928cc5SHong Zhang# taken as the final result. 73*89928cc5SHong Zhangrun_spmv_benchmarks() { 74*89928cc5SHong Zhang [ "${DRY_RUN}" == "true" ] && return 75*89928cc5SHong Zhang if [ "${EXECUTOR}" == "cuda" ]; then 76*89928cc5SHong Zhang ${LAUNCHER} ../mat/tests/bench_spmv -formats "${FORMATS}" -repetitions 5 -use_gpu -AJSON "$1" 77*89928cc5SHong Zhang else 78*89928cc5SHong Zhang ${LAUNCHER} ../mat/tests/bench_spmv -formats "${FORMATS}" -repetitions 5 -AJSON "$1" 79*89928cc5SHong Zhang fi 80*89928cc5SHong Zhang} 81*89928cc5SHong Zhang 82*89928cc5SHong ZhangNUM_PROBLEMS="$(${SSGET} -n)" 83*89928cc5SHong Zhang 84*89928cc5SHong Zhang# Creates an input file for $1-th problem in the SuiteSparse collection 85*89928cc5SHong Zhanggenerate_suite_sparse_input() { 86*89928cc5SHong Zhang INPUT=$(${SSGET} -i "$1" -e) 87*89928cc5SHong Zhang cat << EOT 88*89928cc5SHong Zhang[{ 89*89928cc5SHong Zhang "filename": "${INPUT}", 90*89928cc5SHong Zhang "problem": $(${SSGET} -i "$1" -j) 91*89928cc5SHong Zhang}] 92*89928cc5SHong ZhangEOT 93*89928cc5SHong Zhang} 94*89928cc5SHong Zhang 95*89928cc5SHong Zhang# Append an input file for $1-th problem in the SuiteSparse collection 96*89928cc5SHong Zhangappend_suite_sparse_input() { 97*89928cc5SHong Zhang INPUT=$(${SSGET} -i "$1" -e) 98*89928cc5SHong Zhang cat << EOT 99*89928cc5SHong Zhang { 100*89928cc5SHong Zhang "filename": "${INPUT}", 101*89928cc5SHong Zhang "problem": $(${SSGET} -i "$1" -j) 102*89928cc5SHong Zhang }, 103*89928cc5SHong ZhangEOT 104*89928cc5SHong Zhang} 105*89928cc5SHong Zhang 106*89928cc5SHong Zhangparse_matrix_list() { 107*89928cc5SHong Zhang local source_list_file=$1 108*89928cc5SHong Zhang local benchmark_list="" 109*89928cc5SHong Zhang local id=0 110*89928cc5SHong Zhang for mtx in $(cat ${source_list_file}); do 111*89928cc5SHong Zhang echo $mtx >&2 112*89928cc5SHong Zhang if [[ ! "$mtx" =~ ^[0-9]+$ ]]; then 113*89928cc5SHong Zhang if [[ "$mtx" =~ ^[a-zA-Z0-9_-]+$ ]]; then 114*89928cc5SHong Zhang id=$(${SSGET} -s "[ @name == $mtx ]") 115*89928cc5SHong Zhang elif [[ "$mtx" =~ ^([a-zA-Z0-9_-]+)\/([a-zA-Z0-9_-]+)$ ]]; then 116*89928cc5SHong Zhang local group="${BASH_REMATCH[1]}" 117*89928cc5SHong Zhang local name="${BASH_REMATCH[2]}" 118*89928cc5SHong Zhang id=$(${SSGET} -s "[ @name == $name ] && [ @group == $group ]") 119*89928cc5SHong Zhang else 120*89928cc5SHong Zhang >&2 echo -e "Could not recognize entry $mtx." 121*89928cc5SHong Zhang fi 122*89928cc5SHong Zhang else 123*89928cc5SHong Zhang id=$mtx 124*89928cc5SHong Zhang fi 125*89928cc5SHong Zhang benchmark_list="$benchmark_list $id" 126*89928cc5SHong Zhang done 127*89928cc5SHong Zhang echo "$benchmark_list" 128*89928cc5SHong Zhang} 129*89928cc5SHong Zhang 130*89928cc5SHong Zhangif [ $use_matrix_list_file -eq 1 ]; then 131*89928cc5SHong Zhang MATRIX_LIST=($(parse_matrix_list $MATRIX_LIST_FILE)) 132*89928cc5SHong Zhang NUM_PROBLEMS=${#MATRIX_LIST[@]} 133*89928cc5SHong Zhangfi 134*89928cc5SHong Zhang 135*89928cc5SHong ZhangRESULT_DIR="results/${SYSTEM_NAME}/${EXECUTOR}/SuiteSparse" 136*89928cc5SHong Zhangif [ "${SINGLE_JSON}" == "true" ]; then 137*89928cc5SHong Zhang RESULT_FILE="${RESULT_DIR}/SEGMENT${SEGMENT_ID}.json" 138*89928cc5SHong Zhang cat << EOT >"${RESULT_FILE}" 139*89928cc5SHong Zhang[ 140*89928cc5SHong ZhangEOT 141*89928cc5SHong Zhang mkdir -p "$(dirname "${RESULT_FILE}")" 142*89928cc5SHong Zhangfi 143*89928cc5SHong ZhangLOOP_START=$((1 + (${NUM_PROBLEMS}) * (${SEGMENT_ID} - 1) / ${SEGMENTS})) 144*89928cc5SHong ZhangLOOP_END=$((1 + (${NUM_PROBLEMS}) * (${SEGMENT_ID}) / ${SEGMENTS})) 145*89928cc5SHong Zhang 146*89928cc5SHong Zhangfor (( p=${LOOP_START}; p < ${LOOP_END}; ++p )); do 147*89928cc5SHong Zhang if [ $use_matrix_list_file -eq 1 ]; then 148*89928cc5SHong Zhang i=${MATRIX_LIST[$((p-1))]} 149*89928cc5SHong Zhang else 150*89928cc5SHong Zhang i=$p 151*89928cc5SHong Zhang fi 152*89928cc5SHong Zhang if [ "${BENCHMARK}" == "preconditioner" ]; then 153*89928cc5SHong Zhang break 154*89928cc5SHong Zhang fi 155*89928cc5SHong Zhang if [ "$(${SSGET} -i "$i" -preal)" = "0" ] || [ "$(${SSGET} -i "$i" -pbinary)" = "1" ]; then 156*89928cc5SHong Zhang [ "${DRY_RUN}" != "true" ] && ${SSGET} -i "$i" -c >/dev/null 157*89928cc5SHong Zhang continue 158*89928cc5SHong Zhang fi 159*89928cc5SHong Zhang # filter matrices for spmv tests 160*89928cc5SHong Zhang if [ "${BENCHMARK}" == "spmv" ]; then 161*89928cc5SHong Zhang # deselect non-square matrices and matrices with more than 2B non zeros 162*89928cc5SHong Zhang if [ "$(${SSGET} -i "$i" -pcols)" != "$(${SSGET} -i "$i" -prows)" ] || [ "$(${SSGET} -i "$i" -pnonzeros)" -gt 2000000000 ]; then 163*89928cc5SHong Zhang [ "${DRY_RUN}" != "true" ] && ${SSGET} -i "$i" -c >/dev/null 164*89928cc5SHong Zhang continue 165*89928cc5SHong Zhang fi 166*89928cc5SHong Zhang fi 167*89928cc5SHong Zhang PREFIX="(PROB$p/${NUM_PROBLEMS} ID$i SEG${SEGMENT_ID}):\t" 168*89928cc5SHong Zhang GROUP=$(${SSGET} -i "$i" -pgroup) 169*89928cc5SHong Zhang NAME=$(${SSGET} -i "$i" -pname) 170*89928cc5SHong Zhang if [ "${SINGLE_JSON}" == "false" ]; then 171*89928cc5SHong Zhang RESULT_FILE="${RESULT_DIR}/${GROUP}/${NAME}.json" 172*89928cc5SHong Zhang mkdir -p "$(dirname "${RESULT_FILE}")" 173*89928cc5SHong Zhang echo -e "${PREFIX}Extracting the matrix for ${GROUP}/${NAME}" 1>&2 174*89928cc5SHong Zhang generate_suite_sparse_input "$i" >"${RESULT_FILE}" 175*89928cc5SHong Zhang echo -e "${PREFIX}Running SpMV for ${GROUP}/${NAME}" 1>&2 176*89928cc5SHong Zhang run_spmv_benchmarks "${RESULT_FILE}" 177*89928cc5SHong Zhang echo -e "${PREFIX}Cleaning up problem ${GROUP}/${NAME}" 1>&2 178*89928cc5SHong Zhang [ "${DRY_RUN}" != "true" ] && ${SSGET} -i "$i" -c >/dev/null 179*89928cc5SHong Zhang else 180*89928cc5SHong Zhang append_suite_sparse_input "$i" >>"${RESULT_FILE}" 181*89928cc5SHong Zhang fi 182*89928cc5SHong Zhangdone 183*89928cc5SHong Zhangif [ "${SINGLE_JSON}" == "true" ]; then 184*89928cc5SHong Zhang cat << EOT >"${RESULT_FILE}" 185*89928cc5SHong Zhang] 186*89928cc5SHong ZhangEOT 187*89928cc5SHong Zhang echo -e "${PREFIX}Running SpMV for SEG${SEGMENT_ID}" 1>&2 188*89928cc5SHong Zhang run_spmv_benchmarks "${RESULT_FILE}" 189*89928cc5SHong Zhang for (( p=${LOOP_START}; p < ${LOOP_END}; ++p )); do 190*89928cc5SHong Zhang if [ $use_matrix_list_file -eq 1 ]; then 191*89928cc5SHong Zhang i=${MATRIX_LIST[$((p-1))]} 192*89928cc5SHong Zhang else 193*89928cc5SHong Zhang i=$p 194*89928cc5SHong Zhang fi 195*89928cc5SHong Zhang echo -e "${PREFIX}Cleaning up problem ${i}" 1>&2 196*89928cc5SHong Zhang [ "${DRY_RUN}" != "true" ] && ${SSGET} -i "$i" -c >/dev/null 197*89928cc5SHong Zhang done 198*89928cc5SHong Zhangfi 199