129921a8fSScott Kruger 229921a8fSScott Kruger 329921a8fSScott Krugerscriptname=`basename $0` 429921a8fSScott Krugerrundir=${scriptname%.sh} 534929e0eSSatish BalayTIMEOUT=60 629921a8fSScott Kruger 729921a8fSScott Krugerif test "$PWD"!=`dirname $0`; then 829921a8fSScott Kruger cd `dirname $0` 9aec279ffSScott Kruger abspath_scriptdir=$PWD 1029921a8fSScott Krugerfi 116c91caf2SScott Krugerif test -d "${rundir}" && test -n "${rundir}"; then 1247e61e69SScott Kruger rm -f ${rundir}/*.tmp ${rundir}/*.err ${rundir}/*.out 136c91caf2SScott Krugerfi 1429921a8fSScott Krugermkdir -p ${rundir} 1580a579ceSSatish Balayif test -n "${runfiles}"; then 1680a579ceSSatish Balay for runfile in ${runfiles}; do 1780a579ceSSatish Balay subdir=`dirname ${runfile}` 1880a579ceSSatish Balay mkdir -p ${rundir}/${subdir} 1980a579ceSSatish Balay cp -r ${runfile} ${rundir}/${subdir} 2080a579ceSSatish Balay done 21d7871bd4SScott Krugerfi 2229921a8fSScott Krugercd ${rundir} 2329921a8fSScott Kruger 2429921a8fSScott Kruger# 2529921a8fSScott Kruger# Method to print out general and script specific options 2629921a8fSScott Kruger# 2729921a8fSScott Krugerprint_usage() { 2829921a8fSScott Kruger 2929921a8fSScott Krugercat >&2 <<EOF 3029921a8fSScott KrugerUsage: $0 [options] 3129921a8fSScott Kruger 3229921a8fSScott KrugerOPTIONS 3329921a8fSScott Kruger -a <args> ......... Override default arguments 34aec279ffSScott Kruger -c ................ Cleanup (remove generated files) 35aec279ffSScott Kruger -C ................ Compile 36e53dc769SScott Kruger -d ................ Launch in debugger 3729921a8fSScott Kruger -e <args> ......... Add extra arguments to default 38c1139c55SMatthew Knepley -E <args> ......... Add final arguments to default 392f2809e3SToby Isaac -f ................ force attempt to run test that would otherwise be skipped 4029921a8fSScott Kruger -h ................ help: print this message 4129921a8fSScott Kruger -n <integer> ...... Override the number of processors to use 42ba2c5286SScott Kruger -j ................ Pass -j to petscdiff (just use diff) 43ba2c5286SScott Kruger -J <arg> .......... Pass -J to petscdiff (just use diff with arg) 44ba2c5286SScott Kruger -m ................ Update results using petscdiff 45f50802fbSScott Kruger -M ................ Update alt files using petscdiff 465e361860SScott Kruger -o <arg> .......... Output format: 'interactive', 'err_only' 47a6f3f80dSScott Kruger -p ................ Print command: Print first command and exit 480a091e3eSScott Kruger -t ................ Override the default timeout (default=$TIMEOUT sec) 49baa5c0f4SScott Kruger -U ................ run cUda-memcheck 50b047ed2bSScott Kruger -V ................ run Valgrind 5129921a8fSScott Kruger -v ................ Verbose: Print commands 5229921a8fSScott KrugerEOF 5329921a8fSScott Kruger 5429921a8fSScott Kruger if declare -f extrausage > /dev/null; then extrausage; fi 5529921a8fSScott Kruger exit $1 5629921a8fSScott Kruger} 5729921a8fSScott Kruger### 5829921a8fSScott Kruger## Arguments for overriding things 5929921a8fSScott Kruger# 605e361860SScott Krugeroutput_fmt="interactive" 6129921a8fSScott Krugerverbose=false 6229921a8fSScott Krugercleanup=false 63aec279ffSScott Krugercompile=false 64e53dc769SScott Krugerdebugger=false 65a6f3f80dSScott Krugerprintcmd=false 6663cf4119SScott Krugermpiexec_function=false 672f2809e3SToby Isaacforce=false 68d4417257SScott Krugerdiff_flags="" 69c1139c55SMatthew Knepleywhile getopts "a:cCde:E:fhjJ:mMn:o:pt:UvV" arg 7029921a8fSScott Krugerdo 7129921a8fSScott Kruger case $arg in 72ba2c5286SScott Kruger a ) args="$OPTARG" ;; 7329921a8fSScott Kruger c ) cleanup=true ;; 74aec279ffSScott Kruger C ) compile=true ;; 75e53dc769SScott Kruger d ) debugger=true ;; 76ba2c5286SScott Kruger e ) extra_args="$OPTARG" ;; 77c1139c55SMatthew Knepley E ) final_args="$OPTARG" ;; 782f2809e3SToby Isaac f ) force=true ;; 7929921a8fSScott Kruger h ) print_usage; exit ;; 80ba2c5286SScott Kruger n ) nsize="$OPTARG" ;; 8129dac19bSScott Kruger j ) diff_flags=$diff_flags" -j" ;; 8229dac19bSScott Kruger J ) diff_flags=$diff_flags" -J $OPTARG" ;; 8329dac19bSScott Kruger m ) diff_flags=$diff_flags" -m" ;; 8429dac19bSScott Kruger M ) diff_flags=$diff_flags" -M" ;; 855e361860SScott Kruger o ) output_fmt=$OPTARG ;; 86a6f3f80dSScott Kruger p ) printcmd=true ;; 870a091e3eSScott Kruger t ) TIMEOUT=$OPTARG ;; 8863cf4119SScott Kruger U ) mpiexec="petsc_mpiexec_cudamemcheck $mpiexec" 8963cf4119SScott Kruger mpiexec_function=true 9063cf4119SScott Kruger ;; 9163cf4119SScott Kruger V ) mpiexec="petsc_mpiexec_valgrind $mpiexec" 9263cf4119SScott Kruger mpiexec_function=true 9363cf4119SScott Kruger ;; 9429921a8fSScott Kruger v ) verbose=true ;; 9529921a8fSScott Kruger *) # To take care of any extra args 9629921a8fSScott Kruger if test -n "$OPTARG"; then 9729921a8fSScott Kruger eval $arg=\"$OPTARG\" 9829921a8fSScott Kruger else 9929921a8fSScott Kruger eval $arg=found 10029921a8fSScott Kruger fi 10129921a8fSScott Kruger ;; 10229921a8fSScott Kruger esac 10329921a8fSScott Krugerdone 10429921a8fSScott Krugershift $(( $OPTIND - 1 )) 10529921a8fSScott Kruger 1060a091e3eSScott Kruger# Individual tests can extend the default 10775ea7643SJed Brownexport MPIEXEC_TIMEOUT=$((TIMEOUT*timeoutfactor)) 108bbf1c217SScott KrugerSTARTTIME=`date +%s` 1090a091e3eSScott Kruger 11029921a8fSScott Krugerif test -n "$extra_args"; then 1113176fa97SBarry Smith args="$extra_args $args" 11229921a8fSScott Krugerfi 113c1139c55SMatthew Knepleyif test -n "$final_args"; then 114c1139c55SMatthew Knepley args="$args $final_args" 115c1139c55SMatthew Knepleyfi 116e53dc769SScott Krugerif $debugger; then 117e53dc769SScott Kruger args="-start_in_debugger $args" 118e53dc769SScott Krugerfi 1191725bfbfSScott Krugerif test -n "$filter"; then 1201725bfbfSScott Kruger diff_flags=$diff_flags" -F \$'$filter'" 1211725bfbfSScott Krugerfi 1221725bfbfSScott Krugerif test -n "$filter_output"; then 1231725bfbfSScott Kruger diff_flags=$diff_flags" -f \$'$filter_output'" 1241725bfbfSScott Krugerfi 125e53dc769SScott Kruger 12629921a8fSScott Kruger 12729921a8fSScott Kruger# Init 12829921a8fSScott Krugersuccess=0; failed=0; failures=""; rmfiles="" 12929921a8fSScott Krugertotal=0 13029921a8fSScott Krugertodo=-1; skip=-1 1310a091e3eSScott Krugerjob_level=0 13229921a8fSScott Kruger 13363cf4119SScott Krugerif $compile; then 13463cf4119SScott Kruger curexec=`basename ${exec}` 13563cf4119SScott Kruger fullexec=${abspath_scriptdir}/${curexec} 13656fc7296SScott Kruger maketarget=`echo ${fullexec} | sed "s#${petsc_dir}/*##"` 13763cf4119SScott Kruger (cd $petsc_dir && make -f gmakefile.test ${maketarget}) 13863cf4119SScott Krugerfi 13963cf4119SScott Kruger 14063cf4119SScott Kruger### 14163cf4119SScott Kruger## Rest of code is functions 14263cf4119SScott Kruger# 1435e361860SScott Krugerfunction petsc_report_tapoutput() { 1445e361860SScott Kruger notornot=$1 1455e361860SScott Kruger test_label=$2 1465e361860SScott Kruger comment=$3 1475e361860SScott Kruger if test -n "$comment"; then 1485e361860SScott Kruger comment=" # ${comment}" 1495e361860SScott Kruger fi 1505e361860SScott Kruger 1515e361860SScott Kruger tap_message="${notornot} ok ${test_label}${comment}" 1525e361860SScott Kruger 1535e361860SScott Kruger # Log messages 1545e361860SScott Kruger printf "${tap_message}\n" >> ${testlogtapfile} 1555e361860SScott Kruger 1565e361860SScott Kruger if test ${output_fmt} == "err_only"; then 1575e361860SScott Kruger if test -n "${notornot}"; then 1585e361860SScott Kruger printf "${tap_message}\n" | tee -a ${testlogerrfile} 1595e361860SScott Kruger fi 1605e361860SScott Kruger else 1615e361860SScott Kruger printf "${tap_message}\n" 1625e361860SScott Kruger fi 1635e361860SScott Kruger} 1645e361860SScott Kruger 165a6f3f80dSScott Krugerfunction printcmd() { 166a6f3f80dSScott Kruger # Print command that can be run from PETSC_DIR 167a6f3f80dSScott Kruger cmd="$1" 168a6f3f80dSScott Kruger basedir=`dirname ${PWD} | sed "s#${petsc_dir}/##"` 169581cb8b0SStefano Zampini modcmd=`echo ${cmd} | sed -e "s#\.\.#${basedir}#" | sed s#\>.*## | sed s#\%#\%\%#` 17063cf4119SScott Kruger if $mpiexec_function; then 1710a6ed61bSStefano Zampini # Have to expand valgrind/cudamemcheck 17263cf4119SScott Kruger modcmd=`eval "$modcmd"` 17363cf4119SScott Kruger fi 174a6f3f80dSScott Kruger printf "${modcmd}\n" 175a6f3f80dSScott Kruger exit 176a6f3f80dSScott Kruger} 177a6f3f80dSScott Kruger 17829921a8fSScott Krugerfunction petsc_testrun() { 17929921a8fSScott Kruger # First arg = Basic command 18029921a8fSScott Kruger # Second arg = stdout file 18129921a8fSScott Kruger # Third arg = stderr file 18229921a8fSScott Kruger # Fourth arg = label for reporting 18329921a8fSScott Kruger rmfiles="${rmfiles} $2 $3" 18429921a8fSScott Kruger tlabel=$4 1851725bfbfSScott Kruger error=$5 18629921a8fSScott Kruger cmd="$1 > $2 2> $3" 1871725bfbfSScott Kruger if test -n "$error"; then 1880e86256eSScott Kruger cmd="$1 1> $2 2>&1" 18929921a8fSScott Kruger fi 1901263882eSScott Kruger echo "$cmd" > ${tlabel}.sh; chmod 755 ${tlabel}.sh 191a6f3f80dSScott Kruger if $printcmd; then 192a6f3f80dSScott Kruger printcmd "$cmd" 193a6f3f80dSScott Kruger fi 1947a853109SScott Kruger 195d8e31410SScott Kruger eval "{ time -p $cmd ; } 2>> timing.out" 196679e9f5cSJed Brown cmd_res=$? 1970e86256eSScott Kruger # If testing the error output then we don't test the error code itself 1980e86256eSScott Kruger if test -n "$error"; then 1990e86256eSScott Kruger cmd_res=0 2000e86256eSScott Kruger fi 201ffc4695bSBarry Smith # If it is a lack of GPU resources or MPI failure (Intel) then try once more 202e57d7714SBarry Smith # See: src/sys/error/err.c 203601ce43eSScott Kruger # Error #134 added to handle problems with the Radeon card for hip testing 204601ce43eSScott Kruger if [ $cmd_res -eq 96 -o $cmd_res -eq 97 -o $cmd_res -eq 98 -o $cmd_res -eq 134 ]; then 20528f1f2fbSBarry Smith printf "# retrying ${tlabel}\n" | tee -a ${testlogerrfile} 20628f1f2fbSBarry Smith sleep 3 207e57d7714SBarry Smith eval "{ time -p $cmd ; } 2>> timing.out" 208e57d7714SBarry Smith cmd_res=$? 209e57d7714SBarry Smith fi 2100da08ecbSSatish Balay touch "$2" "$3" 211d5b43468SJose E. Roman # It appears current MPICH and Open MPI just shut down the job execution and do not return an error code to the executable 21228f1f2fbSBarry Smith # ETIMEDOUT=110 was used by Open MPI 3.0. MPICH used 255 21328f1f2fbSBarry Smith # Earlier Open MPI versions returned 1 and the error string 214*db2f5e4bSStefano Zampini # Here we only grep for error strings in output 215*db2f5e4bSStefano Zampini #if [ $cmd_res -eq 110 -o $cmd_res -eq 255 ] || \ 216*db2f5e4bSStefano Zampini if \ 217*db2f5e4bSStefano Zampini grep -F -q -s 'I_MPI_JOB_TIMEOUT' "$2" "$3" || \ 218ef0d7cd8SPierre Jolivet grep -F -q -s 'APPLICATION TIMED OUT' "$2" "$3" || \ 219ef0d7cd8SPierre Jolivet grep -F -q -s MPIEXEC_TIMEOUT "$2" "$3" || \ 220ef0d7cd8SPierre Jolivet grep -F -q -s 'APPLICATION TERMINATED WITH THE EXIT STRING: job ending due to timeout' "$2" "$3" || \ 2218fb2ab26SSatish Balay grep -q -s "Timeout after [0-9]* seconds. Terminating job" "$2" "$3"; then 222984117c4SJed Brown timed_out=1 2237c0e31c5SScott Kruger # If timed out, then ensure non-zero error code 2247c0e31c5SScott Kruger if [ $cmd_res -eq 0 ]; then 2257c0e31c5SScott Kruger cmd_res=1 2267c0e31c5SScott Kruger fi 227984117c4SJed Brown fi 2280a091e3eSScott Kruger 2290a091e3eSScott Kruger # Report errors 2305e361860SScott Kruger comment="" 2317a853109SScott Kruger if test $cmd_res == 0; then 23202afe9ecSJed Brown if "${verbose}"; then 2335e361860SScott Kruger comment="${cmd}" 23402afe9ecSJed Brown fi 2355e361860SScott Kruger petsc_report_tapoutput "" "$tlabel" "$comment" 23629921a8fSScott Kruger let success=$success+1 23729921a8fSScott Kruger else 2384d9d3ee5SSatish Balay if [ -n "$timed_out" ]; then 2395e361860SScott Kruger comment="Exceeded timeout limit of $MPIEXEC_TIMEOUT s" 2404d9d3ee5SSatish Balay else 2415e361860SScott Kruger comment="Error code: ${cmd_res}" 24264ca018dSScott Kruger fi 2435e361860SScott Kruger petsc_report_tapoutput "not" "$tlabel" "$comment" 2445e361860SScott Kruger 2455e361860SScott Kruger # Report errors in detail 2465e361860SScott Kruger if [ -z "$timed_out" ]; then 247570dea68SScott Kruger # We've had tests fail but stderr->stdout, as well as having 248570dea68SScott Kruger # mpi_abort go to stderr which throws this test off. Show both 249570dea68SScott Kruger # with stdout first 2505e361860SScott Kruger awk '{print "#\t" $0}' < $2 | tee -a ${testlogerrfile} 25129dac19bSScott Kruger # if statement is for diff tests 25229dac19bSScott Kruger if test "$2" != "$3"; then 253570dea68SScott Kruger awk '{print "#\t" $0}' < $3 | tee -a ${testlogerrfile} 254984117c4SJed Brown fi 25529dac19bSScott Kruger fi 25629921a8fSScott Kruger let failed=$failed+1 25729921a8fSScott Kruger failures="$failures $tlabel" 25829921a8fSScott Kruger fi 25929921a8fSScott Kruger let total=$success+$failed 2607a853109SScott Kruger return $cmd_res 26129921a8fSScott Kruger} 26229921a8fSScott Kruger 26329921a8fSScott Krugerfunction petsc_testend() { 26429921a8fSScott Kruger logfile=$1/counts/${label}.counts 26529921a8fSScott Kruger logdir=`dirname $logfile` 26629921a8fSScott Kruger if ! test -d "$logdir"; then 26729921a8fSScott Kruger mkdir -p $logdir 26829921a8fSScott Kruger fi 26929921a8fSScott Kruger if ! test -e "$logfile"; then 27029921a8fSScott Kruger touch $logfile 27129921a8fSScott Kruger fi 27229921a8fSScott Kruger printf "total $total\n" > $logfile 27329921a8fSScott Kruger printf "success $success\n" >> $logfile 27429921a8fSScott Kruger printf "failed $failed\n" >> $logfile 27529921a8fSScott Kruger printf "failures $failures\n" >> $logfile 27629921a8fSScott Kruger if test ${todo} -gt 0; then 27729921a8fSScott Kruger printf "todo $todo\n" >> $logfile 27829921a8fSScott Kruger fi 27929921a8fSScott Kruger if test ${skip} -gt 0; then 28029921a8fSScott Kruger printf "skip $skip\n" >> $logfile 28129921a8fSScott Kruger fi 282bbf1c217SScott Kruger ENDTIME=`date +%s` 283f53b81b6SPierre Jolivet timing=`touch timing.out && grep -E '(user|sys)' timing.out | awk '{if( sum1 == "" || $2 > sum1 ) { sum1=sprintf("%.2f",$2) } ; sum2 += sprintf("%.2f",$2)} END {printf "%.2f %.2f\n",sum1,sum2}'` 284521be42fSScott Kruger printf "time $timing\n" >> $logfile 28529921a8fSScott Kruger if $cleanup; then 28629921a8fSScott Kruger echo "Cleaning up" 28729921a8fSScott Kruger /bin/rm -f $rmfiles 28829921a8fSScott Kruger fi 28929921a8fSScott Kruger} 290296e37cfSJed Brown 291baa5c0f4SScott Krugerfunction petsc_mpiexec_cudamemcheck() { 292636bfc99SJacob Faibussowitsch # loops over the argument list to find the call to the test executable and insert the 293636bfc99SJacob Faibussowitsch # cuda memcheck command before it. 294636bfc99SJacob Faibussowitsch # first check if compute-sanitizer exists, since cuda-memcheck is deprecated from CUDA 295636bfc99SJacob Faibussowitsch # 11-ish onwards 296636bfc99SJacob Faibussowitsch if command -v compute-sanitizer &> /dev/null; then 297636bfc99SJacob Faibussowitsch memcheck_cmd="${PETSC_CUDAMEMCHECK_COMMAND:-compute-sanitizer}" 298636bfc99SJacob Faibussowitsch declare -a default_args_to_check=('--target-processes all' '--track-stream-ordered-races all') 299636bfc99SJacob Faibussowitsch else 300636bfc99SJacob Faibussowitsch memcheck_cmd="${PETSC_CUDAMEMCHECK_COMMAND:-cuda-memcheck}" 301636bfc99SJacob Faibussowitsch declare -a default_args_to_check=('--flush-to-disk yes') 302636bfc99SJacob Faibussowitsch fi 303636bfc99SJacob Faibussowitsch if [[ -z ${PETSC_CUDAMEMCHECK_ARGS} ]]; then 304636bfc99SJacob Faibussowitsch # if user has not set the memcheck args themselves loop over the predefined default 305636bfc99SJacob Faibussowitsch # arguments and check if they can be used 306636bfc99SJacob Faibussowitsch memcheck_args='--leak-check full --report-api-errors no ' 307636bfc99SJacob Faibussowitsch for option in "${default_args_to_check[@]}"; do 308636bfc99SJacob Faibussowitsch ${memcheck_cmd} ${memcheck_args} ${option} &> /dev/null 309636bfc99SJacob Faibussowitsch if [ $? -eq 0 ]; then 310636bfc99SJacob Faibussowitsch memcheck_args+="${option} " 311636bfc99SJacob Faibussowitsch fi 312636bfc99SJacob Faibussowitsch done 313636bfc99SJacob Faibussowitsch else 314636bfc99SJacob Faibussowitsch memcheck_args="${PETSC_CUDAMEMCHECK_ARGS}" 315636bfc99SJacob Faibussowitsch fi 316636bfc99SJacob Faibussowitsch pre_args=() 3172ef0b79dSStefano Zampini # regex to detect where the test lives in the command line. This 318636bfc99SJacob Faibussowitsch # marks the end of the options to mpiexec, and hence where we should insert the 319636bfc99SJacob Faibussowitsch # cuda-memcheck command 3202ef0b79dSStefano Zampini re="${executable}" 321636bfc99SJacob Faibussowitsch for i in "$@"; do 322d8b4a066SPierre Jolivet # first occurrence of the presence of petsc_arch is the executable, 3230a6ed61bSStefano Zampini # except when we install MPI ourselves 3242ef0b79dSStefano Zampini if [[ $i =~ ${re} ]]; then 325636bfc99SJacob Faibussowitsch # found it, put cuda memcheck command in 326636bfc99SJacob Faibussowitsch pre_args+=("${memcheck_cmd} ${memcheck_args}") 327636bfc99SJacob Faibussowitsch break 328636bfc99SJacob Faibussowitsch fi 329636bfc99SJacob Faibussowitsch pre_args+=("$i") 330636bfc99SJacob Faibussowitsch shift 331636bfc99SJacob Faibussowitsch done 332636bfc99SJacob Faibussowitsch # run command, but filter out 333636bfc99SJacob Faibussowitsch # ===== CUDA-MEMCHECK or ==== COMPUTE-SANITIZER 334636bfc99SJacob Faibussowitsch # and 335636bfc99SJacob Faibussowitsch # ===== ERROR SUMMARY: 0 errors 336636bfc99SJacob Faibussowitsch if ${printcmd}; then 3370a6ed61bSStefano Zampini echo ${pre_args[@]} "$@" 338636bfc99SJacob Faibussowitsch else 3390a6ed61bSStefano Zampini ${pre_args[@]} "$@" \ 340636bfc99SJacob Faibussowitsch | grep -v 'CUDA-MEMCHECK' \ 341636bfc99SJacob Faibussowitsch | grep -v 'COMPUTE-SANITIZER' \ 342636bfc99SJacob Faibussowitsch | grep -v 'LEAK SUMMARY: 0 bytes leaked in 0 allocations' \ 343636bfc99SJacob Faibussowitsch | grep -v 'ERROR SUMMARY: 0 errors' || [[ $? == 1 ]] 344636bfc99SJacob Faibussowitsch fi 345636bfc99SJacob Faibussowitsch # last or is needed to suppress grep exiting with error code 1 if it doesn't find a 346636bfc99SJacob Faibussowitsch # match 347baa5c0f4SScott Kruger} 348baa5c0f4SScott Kruger 34926646c0bSSatish Balayfunction petsc_mpiexec_valgrind() { 3500a6ed61bSStefano Zampini valgrind_cmd="valgrind -q --tool=memcheck --leak-check=yes --num-callers=20 --track-origins=yes --keep-debuginfo=yes --suppressions=${PETSC_DIR}/share/petsc/suppressions/valgrind --error-exitcode=10" 3510a6ed61bSStefano Zampini pre_args=() 3522ef0b79dSStefano Zampini re="${executable}" 3530a6ed61bSStefano Zampini for i in "$@"; do 3542ef0b79dSStefano Zampini if [[ $i =~ ${re} ]]; then 3550a6ed61bSStefano Zampini pre_args+=("${valgrind_cmd}") 3560a6ed61bSStefano Zampini break 35790544984SBarry Smith fi 3580a6ed61bSStefano Zampini pre_args+=("$i") 3590a6ed61bSStefano Zampini shift 3600a6ed61bSStefano Zampini done 3610a6ed61bSStefano Zampini if ${printcmd}; then 3620a6ed61bSStefano Zampini echo ${pre_args[@]} "$@" 36363cf4119SScott Kruger else 3640a6ed61bSStefano Zampini ${pre_args[@]} "$@" 36563cf4119SScott Kruger fi 36626646c0bSSatish Balay} 367296e37cfSJed Brownexport LC_ALL=C 368