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