xref: /petsc/src/benchmarks/run_petsc_benchmarks.sh (revision bcd4bb4a4158aa96f212e9537e87b40407faf83e)
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