189928cc5SHong Zhang#!/bin/bash 289928cc5SHong Zhang 389928cc5SHong Zhang# Before running this script, make sure set up the directory for storing the downloaded matrix files (ARCHIVE_LOCATION) 489928cc5SHong ZhangARCHIVE_LOCATION="" 589928cc5SHong ZhangSSGET=./ssget 689928cc5SHong Zhang 789928cc5SHong Zhangif [ ! "${BENCHMARK}" ]; then 889928cc5SHong Zhang BENCHMARK="spmv" 989928cc5SHong Zhang echo "BENCHMARK environment variable not set - assuming \"${BENCHMARK}\"" 1>&2 1089928cc5SHong Zhangfi 1189928cc5SHong Zhang 1289928cc5SHong Zhangif [ ! "${DRY_RUN}" ]; then 1389928cc5SHong Zhang DRY_RUN="false" 1489928cc5SHong Zhang echo "DRY_RUN environment variable not set - assuming \"${DRY_RUN}\"" 1>&2 1589928cc5SHong Zhangfi 1689928cc5SHong Zhang 1789928cc5SHong Zhangif [ ! "${EXECUTOR}" ]; then 1889928cc5SHong Zhang EXECUTOR="cuda" 1989928cc5SHong Zhang echo "EXECUTOR environment variable not set - assuming \"${EXECUTOR}\"" 1>&2 2089928cc5SHong Zhangfi 2189928cc5SHong Zhang 2289928cc5SHong Zhangif [ ! "${SEGMENTS}" ]; then 2389928cc5SHong Zhang echo "SEGMENTS environment variable not set - running entire suite" 1>&2 2489928cc5SHong Zhang SEGMENTS=1 2589928cc5SHong Zhang SEGMENT_ID=1 2689928cc5SHong Zhangelif [ ! "${SEGMENT_ID}" ]; then 2789928cc5SHong Zhang echo "SEGMENT_ID environment variable not set - exiting" 1>&2 2889928cc5SHong Zhang exit 1 2989928cc5SHong Zhangfi 3089928cc5SHong Zhang 3189928cc5SHong Zhangif [ ! "${FORMATS}" ]; then 3289928cc5SHong Zhang echo "FORMATS environment variable not set - assuming \"csr\"" 1>&2 3389928cc5SHong Zhang FORMATS="csr" 3489928cc5SHong Zhangfi 3589928cc5SHong Zhang 3689928cc5SHong Zhangif [ ! "${DEVICE_ID}" ]; then 3789928cc5SHong Zhang DEVICE_ID="0" 3889928cc5SHong Zhang echo "DEVICE_ID environment variable not set - assuming \"${DEVICE_ID}\"" 1>&2 3989928cc5SHong Zhangfi 4089928cc5SHong Zhang 4189928cc5SHong Zhangif [ ! "${SINGLE_JSON}" ]; then 4289928cc5SHong Zhang SINGLE_JSON="false" 4389928cc5SHong Zhang echo "SINGLE_JSON environment variable not set - assuming \"${SINGLE_JSONR}\"" 1>&2 4489928cc5SHong Zhangfi 4589928cc5SHong Zhang 4689928cc5SHong Zhangif [ ! "${LAUNCHER}" ]; then 4789928cc5SHong Zhang LAUNCHER="" 4889928cc5SHong Zhang echo "LAUNCHER environment variable not set - assuming \"${LAUNCHER}\"" 1>&2 4989928cc5SHong Zhangfi 5089928cc5SHong Zhang 5189928cc5SHong Zhang# This allows using a matrix list file for benchmarking. 5289928cc5SHong Zhang# The file should contains a suitesparse matrix on each line. 5389928cc5SHong Zhang# The allowed formats to target suitesparse matrix is: 5489928cc5SHong Zhang# id or group/name or name. 5589928cc5SHong Zhang# Example: 5689928cc5SHong Zhang# 1903 5789928cc5SHong Zhang# Freescale/circuit5M 5889928cc5SHong Zhang# thermal2 5989928cc5SHong Zhangif [ ! "${MATRIX_LIST_FILE}" ]; then 6089928cc5SHong Zhang use_matrix_list_file=0 6189928cc5SHong Zhangelif [ -f "${MATRIX_LIST_FILE}" ]; then 6289928cc5SHong Zhang use_matrix_list_file=1 6389928cc5SHong Zhangelse 6489928cc5SHong Zhang echo -e "A matrix list file was set to ${MATRIX_LIST_FILE} but it cannot be found." 6589928cc5SHong Zhang exit 1 6689928cc5SHong Zhangfi 6789928cc5SHong Zhang 6889928cc5SHong Zhang# Runs the SpMV benchmarks for all SpMV formats by using file $1 as the input, 6989928cc5SHong Zhang# and updating it with the results. Backups are created after each 7089928cc5SHong Zhang# benchmark run, to prevent data loss in case of a crash. Once the benchmarking 7189928cc5SHong Zhang# is completed, the backups and the results are combined, and the newest file is 7289928cc5SHong Zhang# taken as the final result. 7389928cc5SHong Zhangrun_spmv_benchmarks() { 7489928cc5SHong Zhang [ "${DRY_RUN}" == "true" ] && return 75773bf0f6SHong Zhang if [ "${EXECUTOR}" == "cuda" ] || [ "${EXECUTOR}" == "hip" ]; then 7689928cc5SHong Zhang ${LAUNCHER} ../mat/tests/bench_spmv -formats "${FORMATS}" -repetitions 5 -use_gpu -AJSON "$1" 7789928cc5SHong Zhang else 7889928cc5SHong Zhang ${LAUNCHER} ../mat/tests/bench_spmv -formats "${FORMATS}" -repetitions 5 -AJSON "$1" 7989928cc5SHong Zhang fi 8089928cc5SHong Zhang} 8189928cc5SHong Zhang 8289928cc5SHong ZhangNUM_PROBLEMS="$(${SSGET} -n)" 8389928cc5SHong Zhang 8489928cc5SHong Zhang# Creates an input file for $1-th problem in the SuiteSparse collection 8589928cc5SHong Zhanggenerate_suite_sparse_input() { 8689928cc5SHong Zhang INPUT=$(${SSGET} -i "$1" -e) 8789928cc5SHong Zhang cat << EOT 8889928cc5SHong Zhang[{ 8989928cc5SHong Zhang "filename": "${INPUT}", 9089928cc5SHong Zhang "problem": $(${SSGET} -i "$1" -j) 9189928cc5SHong Zhang}] 9289928cc5SHong ZhangEOT 9389928cc5SHong Zhang} 9489928cc5SHong Zhang 9589928cc5SHong Zhang# Append an input file for $1-th problem in the SuiteSparse collection 9689928cc5SHong Zhangappend_suite_sparse_input() { 9789928cc5SHong Zhang INPUT=$(${SSGET} -i "$1" -e) 9889928cc5SHong Zhang cat << EOT 9989928cc5SHong Zhang { 10089928cc5SHong Zhang "filename": "${INPUT}", 10189928cc5SHong Zhang "problem": $(${SSGET} -i "$1" -j) 10289928cc5SHong Zhang }, 10389928cc5SHong ZhangEOT 10489928cc5SHong Zhang} 10589928cc5SHong Zhang 10689928cc5SHong Zhangparse_matrix_list() { 10789928cc5SHong Zhang local source_list_file=$1 10889928cc5SHong Zhang local benchmark_list="" 10989928cc5SHong Zhang local id=0 110*bcd4bb4aSBarry Smith for mtx in $(cat "${source_list_file}"); do 111*bcd4bb4aSBarry Smith echo "$mtx" >&2 11289928cc5SHong Zhang if [[ ! "$mtx" =~ ^[0-9]+$ ]]; then 11389928cc5SHong Zhang if [[ "$mtx" =~ ^[a-zA-Z0-9_-]+$ ]]; then 11489928cc5SHong Zhang id=$(${SSGET} -s "[ @name == $mtx ]") 11589928cc5SHong Zhang elif [[ "$mtx" =~ ^([a-zA-Z0-9_-]+)\/([a-zA-Z0-9_-]+)$ ]]; then 11689928cc5SHong Zhang local group="${BASH_REMATCH[1]}" 11789928cc5SHong Zhang local name="${BASH_REMATCH[2]}" 11889928cc5SHong Zhang id=$(${SSGET} -s "[ @name == $name ] && [ @group == $group ]") 11989928cc5SHong Zhang else 12089928cc5SHong Zhang >&2 echo -e "Could not recognize entry $mtx." 12189928cc5SHong Zhang fi 12289928cc5SHong Zhang else 12389928cc5SHong Zhang id=$mtx 12489928cc5SHong Zhang fi 12589928cc5SHong Zhang benchmark_list="$benchmark_list $id" 12689928cc5SHong Zhang done 12789928cc5SHong Zhang echo "$benchmark_list" 12889928cc5SHong Zhang} 12989928cc5SHong Zhang 13089928cc5SHong Zhangif [ $use_matrix_list_file -eq 1 ]; then 131*bcd4bb4aSBarry Smith MATRIX_LIST=($(parse_matrix_list "$MATRIX_LIST_FILE")) 13289928cc5SHong Zhang NUM_PROBLEMS=${#MATRIX_LIST[@]} 13389928cc5SHong Zhangfi 13489928cc5SHong Zhang 13589928cc5SHong ZhangRESULT_DIR="results/${SYSTEM_NAME}/${EXECUTOR}/SuiteSparse" 13689928cc5SHong Zhangif [ "${SINGLE_JSON}" == "true" ]; then 13789928cc5SHong Zhang RESULT_FILE="${RESULT_DIR}/SEGMENT${SEGMENT_ID}.json" 13889928cc5SHong Zhang cat << EOT >"${RESULT_FILE}" 13989928cc5SHong Zhang[ 14089928cc5SHong ZhangEOT 14189928cc5SHong Zhang mkdir -p "$(dirname "${RESULT_FILE}")" 14289928cc5SHong Zhangfi 14389928cc5SHong ZhangLOOP_START=$((1 + (${NUM_PROBLEMS}) * (${SEGMENT_ID} - 1) / ${SEGMENTS})) 14489928cc5SHong ZhangLOOP_END=$((1 + (${NUM_PROBLEMS}) * (${SEGMENT_ID}) / ${SEGMENTS})) 14589928cc5SHong Zhang 14689928cc5SHong Zhangfor (( p=${LOOP_START}; p < ${LOOP_END}; ++p )); do 14789928cc5SHong Zhang if [ $use_matrix_list_file -eq 1 ]; then 14889928cc5SHong Zhang i=${MATRIX_LIST[$((p-1))]} 14989928cc5SHong Zhang else 15089928cc5SHong Zhang i=$p 15189928cc5SHong Zhang fi 15289928cc5SHong Zhang if [ "${BENCHMARK}" == "preconditioner" ]; then 15389928cc5SHong Zhang break 15489928cc5SHong Zhang fi 15589928cc5SHong Zhang if [ "$(${SSGET} -i "$i" -preal)" = "0" ] || [ "$(${SSGET} -i "$i" -pbinary)" = "1" ]; then 15689928cc5SHong Zhang [ "${DRY_RUN}" != "true" ] && ${SSGET} -i "$i" -c >/dev/null 15789928cc5SHong Zhang continue 15889928cc5SHong Zhang fi 15989928cc5SHong Zhang # filter matrices for spmv tests 16089928cc5SHong Zhang if [ "${BENCHMARK}" == "spmv" ]; then 16189928cc5SHong Zhang # deselect non-square matrices and matrices with more than 2B non zeros 16289928cc5SHong Zhang if [ "$(${SSGET} -i "$i" -pcols)" != "$(${SSGET} -i "$i" -prows)" ] || [ "$(${SSGET} -i "$i" -pnonzeros)" -gt 2000000000 ]; then 16389928cc5SHong Zhang [ "${DRY_RUN}" != "true" ] && ${SSGET} -i "$i" -c >/dev/null 16489928cc5SHong Zhang continue 16589928cc5SHong Zhang fi 16689928cc5SHong Zhang fi 16789928cc5SHong Zhang PREFIX="(PROB$p/${NUM_PROBLEMS} ID$i SEG${SEGMENT_ID}):\t" 16889928cc5SHong Zhang GROUP=$(${SSGET} -i "$i" -pgroup) 16989928cc5SHong Zhang NAME=$(${SSGET} -i "$i" -pname) 17089928cc5SHong Zhang if [ "${SINGLE_JSON}" == "false" ]; then 17189928cc5SHong Zhang RESULT_FILE="${RESULT_DIR}/${GROUP}/${NAME}.json" 17289928cc5SHong Zhang mkdir -p "$(dirname "${RESULT_FILE}")" 17389928cc5SHong Zhang echo -e "${PREFIX}Extracting the matrix for ${GROUP}/${NAME}" 1>&2 17489928cc5SHong Zhang generate_suite_sparse_input "$i" >"${RESULT_FILE}" 17589928cc5SHong Zhang echo -e "${PREFIX}Running SpMV for ${GROUP}/${NAME}" 1>&2 17689928cc5SHong Zhang run_spmv_benchmarks "${RESULT_FILE}" 177773bf0f6SHong Zhang # echo -e "${PREFIX}Cleaning up problem ${GROUP}/${NAME}" 1>&2 178773bf0f6SHong Zhang # [ "${DRY_RUN}" != "true" ] && ${SSGET} -i "$i" -c >/dev/null 17989928cc5SHong Zhang else 18089928cc5SHong Zhang append_suite_sparse_input "$i" >>"${RESULT_FILE}" 18189928cc5SHong Zhang fi 18289928cc5SHong Zhangdone 18389928cc5SHong Zhangif [ "${SINGLE_JSON}" == "true" ]; then 18489928cc5SHong Zhang cat << EOT >"${RESULT_FILE}" 18589928cc5SHong Zhang] 18689928cc5SHong ZhangEOT 18789928cc5SHong Zhang echo -e "${PREFIX}Running SpMV for SEG${SEGMENT_ID}" 1>&2 18889928cc5SHong Zhang run_spmv_benchmarks "${RESULT_FILE}" 18989928cc5SHong Zhang for (( p=${LOOP_START}; p < ${LOOP_END}; ++p )); do 19089928cc5SHong Zhang if [ $use_matrix_list_file -eq 1 ]; then 19189928cc5SHong Zhang i=${MATRIX_LIST[$((p-1))]} 19289928cc5SHong Zhang else 19389928cc5SHong Zhang i=$p 19489928cc5SHong Zhang fi 19589928cc5SHong Zhang echo -e "${PREFIX}Cleaning up problem ${i}" 1>&2 19689928cc5SHong Zhang [ "${DRY_RUN}" != "true" ] && ${SSGET} -i "$i" -c >/dev/null 19789928cc5SHong Zhang done 19889928cc5SHong Zhangfi 199