#!/bin/bash # Bash is required due to usage of arrays SAVE_DIR=`pwd` MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) DVMSYS_DIR="$1" TEST_SUITE="$2" TASK_PROCESSOR_FD=$3 . "$MY_DIR/machine-config.sh" if [ -f "$SAVE_DIR/machine-config.sh" ]; then . "$SAVE_DIR/machine-config.sh" fi . "$MY_DIR/test-utils.sh" PLATFORM_CMD=$(grep "PLATFORM=" <"$DVMSYS_DIR/bin/dvm_settings.sh" | sed -s 's/export //g') eval $PLATFORM_CMD SETTINGS_FILE=settings ANALYZER_FILE=test-analyzer.sh prepare_new_dir() { local TASK_DIR TASK_DIR=`mktemp -d` local COMP_OPTS COMP_OPTS="$1" local COMPILE_PID local COMPILE_RES cd "$TASK_DIR" echo "#!/bin/sh" >dvm echo "export dvmarithmloopsize=1000000" >>dvm echo "exec '$DVMSYS_DIR/bin/dvm_drv' \"\$@\"" >>dvm chmod a+x dvm cp "$DVMSYS_DIR/user/usr.par" ./ set -m if [ -f "$TEST_FILE" ]; then cp "$TEST_FILE" "$TEST_NAME" ./dvm $LANG_COMP -shared-dvm $COMP_OPTS "$TEST_NAME" >"build.log" 2>& 1 & COMPILE_PID=$! else find "$TEST_FILE" -mindepth 1 -maxdepth 1 | xargs cp -r -t . PATH="$TASK_DIR:$PATH" ./compile.sh $COMP_OPTS >"build.log" 2>& 1 & COMPILE_PID=$! fi proc_killer -$COMPILE_PID 600 & KILLER_PID=$! disown wait $COMPILE_PID COMPILE_RES=$? kill -2 $KILLER_PID >/dev/null 2>& 1 kill -15 $KILLER_PID >/dev/null 2>& 1 kill -9 $KILLER_PID >/dev/null 2>& 1 if [ ! -f "$TEST_FILE" ] && [ $COMPILE_RES -eq 0 ] && [ ! -f "$TEST_EXENAME" ]; then :> "$TEST_EXENAME" fi echo "$TASK_DIR" } do_test() { TEST_FILE="$1" TEST_NAME=`basename "$TEST_FILE"` TEST_SHORT_PATH="$TEST_NAME" TMPSTR=`dirname $TEST_FILE` while [ "$TMPSTR" != "$TEST_SUITE" ]; do TEST_SHORT_PATH="$(basename $TMPSTR)/$TEST_SHORT_PATH" TMPSTR=`dirname $TMPSTR` done TEST_EXENAME="${TEST_NAME%.*}" case ${TEST_NAME##*.} in c|cdv) IS_FORTRAN=0;; f|f90|fdv) IS_FORTRAN=1;; esac if [ $IS_FORTRAN -ne 0 ]; then LANG_COMP="f" else LANG_COMP="c" fi TEST_DIMS= if [ -n "$DIMENSION_COUNT" ]; then TEST_DIMS=$DIMENSION_COUNT else for t in $DIMENSION_MAP; do FN=`echo $t | sed 's/=/ /g' | awk '{print $1}'` DIM=`echo $t | sed 's/=/ /g' | awk '{print $2}'` if [ "$FN" = "$TEST_NAME" ]; then TEST_DIMS=$DIM break fi done fi if [ -z "$TEST_DIMS" ]; then # Trying to extract dimension number from filename - it is first digit in it. TEST_DIMS=`echo "$TEST_EXENAME" | sed 's/[^0-9]//g' | cut -c1` fi if [ -z "$TEST_DIMS" ]; then echo "Can not find information about dimension count for test $TEST_FILE" >& 2 TEST_DIMS=1 fi if [ $MAX_DIM_PROC_COUNT -le 0 ]; then MAX_DIM_PROC_COUNT=$MAX_PROC_COUNT fi while true; do if [ -f "$SAVE_DIR/dvm-tester.pause" ] && [ "$(cat "$SAVE_DIR/dvm-tester.pause")" = "Immediate" ]; then echo "Paused explicitly (local)" elif [ -f "$MY_DIR/dvm-tester.pause" ] && [ "$(cat "$MY_DIR/dvm-tester.pause")" = "Immediate" ]; then echo "Paused explicitly (global)" else break fi sleep 60 done echo "Compiling $TEST_SHORT_PATH on $PLATFORM platform" if [ $GPU_ONLY -eq 0 ]; then # Compile with noH NOH_DIR=`prepare_new_dir "-noH"` if [ -f "$NOH_DIR/$TEST_EXENAME" ]; then ISSUE_NOH=1 else ISSUE_NOH=0 fi fi if [ $DVM_ONLY -eq 0 ]; then # Compile without noH H_DIR=`prepare_new_dir ""` if [ -f "$H_DIR/$TEST_EXENAME" ]; then ISSUE_H=1 else ISSUE_H=0 fi # And with autoTfm AUTOTFM_DIR=`prepare_new_dir "-autoTfm"` if [ -f "$AUTOTFM_DIR/$TEST_EXENAME" ]; then ISSUE_AUTOTFM=1 else ISSUE_AUTOTFM=0 fi fi # cat "$H_DIR/build.log" echo "Generating tasks for $TEST_SHORT_PATH with $TEST_DIMS dimensions on $PLATFORM platform" COMMON_PART=$( echo -n "TASK_TYPE=1" echo -n " TEST_PLATFORM=$PLATFORM" echo -n " SHARE_RESOURCES=$SHARE_RESOURCES" echo -n " TEST_ANALYZER=\"$TEST_ANALYZER\"" echo -n " TEST_SHORT_PATH=\"$TEST_SHORT_PATH\"" echo -n " TASK_EXE=\"$TEST_EXENAME\"" echo -n " TEST_MAX_TIME=$MAX_TIME" ) # Additional size number 0 added i=0 while [ $i -le $TEST_DIMS ]; do sizes[$i]=1 i=$(( i + 1 )) done counter=0 totalSize=1 while [ $(( sizes[0] )) -eq 1 ]; do PROC_GRID= if [ $IS_FORTRAN -eq 0 ]; then i=1 while [ $i -le $TEST_DIMS ]; do PROC_GRID="$PROC_GRID $((sizes[i]))" i=$(( i + 1 )) done else i=$TEST_DIMS while [ $i -ge 1 ]; do PROC_GRID="$PROC_GRID $((sizes[i]))" i=$(( i - 1 )) done fi if [ $GPU_ONLY -eq 0 ]; then if [ $ISSUE_NOH -ne 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$NOH_DIR\"" >&$TASK_PROCESSOR_FD echo -n " TASK_NOH_FLAG=1" >&$TASK_PROCESSOR_FD echo -n " CPUS_PER_PROC=1" >&$TASK_PROCESSOR_FD echo -n " PROC_GRID=\"$PROC_GRID\"" >&$TASK_PROCESSOR_FD counter=$(( counter + 1 )) echo >&$TASK_PROCESSOR_FD fi fi if [ $DVM_ONLY -eq 0 ]; then # Single-device and single-threaded configurations if [ $GPU_ONLY -eq 0 ]; then if [ $ISSUE_H -ne 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD echo -n " CPUS_PER_PROC=1" >&$TASK_PROCESSOR_FD echo -n " PROC_GRID=\"$PROC_GRID\"" >&$TASK_PROCESSOR_FD counter=$(( counter + 1 )) echo >&$TASK_PROCESSOR_FD fi fi if [ $CUDAS_PER_NODE -gt 0 ]; then if [ $ISSUE_H -ne 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD echo -n " CUDAS_PER_PROC=1" >&$TASK_PROCESSOR_FD echo -n " PROC_GRID=\"$PROC_GRID\"" >&$TASK_PROCESSOR_FD counter=$(( counter + 1 )) echo >&$TASK_PROCESSOR_FD fi if [ $ISSUE_AUTOTFM -ne 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$AUTOTFM_DIR\"" >&$TASK_PROCESSOR_FD echo -n " TASK_AUTOTFM_FLAG=1" >&$TASK_PROCESSOR_FD echo -n " CUDAS_PER_PROC=1" >&$TASK_PROCESSOR_FD echo -n " PROC_GRID=\"$PROC_GRID\"" >&$TASK_PROCESSOR_FD counter=$(( counter + 1 )) echo >&$TASK_PROCESSOR_FD fi fi # Multi-device and multi-threaded configurations MAX_DEVS_PER_PROC=$((sizes[1])) DEVS_PER_PROC=2 while [ $DEVS_PER_PROC -le $MAX_DEVS_PER_PROC ]; do if [ $(( MAX_DEVS_PER_PROC % DEVS_PER_PROC )) -ne 0 ]; then DEVS_PER_PROC=$(( $DEVS_PER_PROC + 1 )) continue fi if [ $IS_FORTRAN -eq 0 ]; then MD_PROC_GRID=" $((MAX_DEVS_PER_PROC / DEVS_PER_PROC))" i=2 while [ $i -le $TEST_DIMS ]; do MD_PROC_GRID="$MD_PROC_GRID $((sizes[i]))" i=$(( i + 1 )) done else MD_PROC_GRID= i=$TEST_DIMS while [ $i -ge 2 ]; do MD_PROC_GRID="$MD_PROC_GRID $((sizes[i]))" i=$(( i - 1 )) done MD_PROC_GRID="$MD_PROC_GRID $((MAX_DEVS_PER_PROC / DEVS_PER_PROC))" fi if [ $GPU_ONLY -eq 0 ]; then if [ $ISSUE_H -ne 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD echo -n " CPUS_PER_PROC=$DEVS_PER_PROC" >&$TASK_PROCESSOR_FD echo -n " PROC_GRID=\"$MD_PROC_GRID\"" >&$TASK_PROCESSOR_FD counter=$(( counter + 1 )) echo >&$TASK_PROCESSOR_FD fi fi if [ $ALLOW_MULTIDEV -ne 0 ] && [ $CUDAS_PER_NODE -gt 0 ]; then for ((GPUS_PER_PROC=1; GPUS_PER_PROC<=$DEVS_PER_PROC; GPUS_PER_PROC++)); do if [ $ISSUE_H -ne 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD echo -n " CPUS_PER_PROC=$(($DEVS_PER_PROC - $GPUS_PER_PROC))" >&$TASK_PROCESSOR_FD echo -n " CUDAS_PER_PROC=$GPUS_PER_PROC" >&$TASK_PROCESSOR_FD echo -n " PROC_GRID=\"$MD_PROC_GRID\"" >&$TASK_PROCESSOR_FD counter=$(( counter + 1 )) echo >&$TASK_PROCESSOR_FD fi if [ $ISSUE_AUTOTFM -ne 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$AUTOTFM_DIR\"" >&$TASK_PROCESSOR_FD echo -n " TASK_AUTOTFM_FLAG=1" >&$TASK_PROCESSOR_FD echo -n " CPUS_PER_PROC=$(($DEVS_PER_PROC - $GPUS_PER_PROC))" >&$TASK_PROCESSOR_FD echo -n " CUDAS_PER_PROC=$GPUS_PER_PROC" >&$TASK_PROCESSOR_FD echo -n " PROC_GRID=\"$MD_PROC_GRID\"" >&$TASK_PROCESSOR_FD counter=$(( counter + 1 )) echo >&$TASK_PROCESSOR_FD fi done fi DEVS_PER_PROC=$(( $DEVS_PER_PROC + 1 )) done fi # Advance to next configuration i=$TEST_DIMS while [ $i -ge 0 ]; do sizes[$i]=$(( sizes[i] + 1 )) totalSize=1 j=1 while [ $j -le $TEST_DIMS ]; do totalSize=$(( totalSize * sizes[j] )) j=$(( j + 1 )) done if [ $(( sizes[i] )) -le $MAX_DIM_PROC_COUNT -a $totalSize -le $MAX_PROC_COUNT ]; then break elif [ $i -gt 0 ]; then sizes[$i]=1 fi i=$(( i - 1 )) done done echo "Generated $counter tasks" COMMON_PART=$( echo -n "TASK_TYPE=0" echo -n " TEST_PLATFORM=$PLATFORM" echo -n " TEST_SHORT_PATH=\"$TEST_SHORT_PATH\"" echo -n " TASK_EXE=\"$TEST_EXENAME\"" ) if [ $GPU_ONLY -eq 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$NOH_DIR\"" >&$TASK_PROCESSOR_FD echo -n " TASK_NOH_FLAG=1" >&$TASK_PROCESSOR_FD echo >&$TASK_PROCESSOR_FD fi if [ $DVM_ONLY -eq 0 ]; then echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD echo >&$TASK_PROCESSOR_FD echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD echo -n " TASK_DIR=\"$AUTOTFM_DIR\"" >&$TASK_PROCESSOR_FD echo -n " TASK_AUTOTFM_FLAG=1" >&$TASK_PROCESSOR_FD echo >&$TASK_PROCESSOR_FD fi } traverse_tests() { CUR_DIR="$1" if [ -f "$CUR_DIR/$SETTINGS_FILE" ]; then . "$CUR_DIR/$SETTINGS_FILE" fi if [ -f "$CUR_DIR/$ANALYZER_FILE" ]; then TEST_ANALYZER="$CUR_DIR/$ANALYZER_FILE" fi TESTS=`mktemp` find "$CUR_DIR" -mindepth 1 -maxdepth 1 -regex '.*[.]\(c\|cdv\|f\|f90\|fdv\)' | LC_ALL=C sort >$TESTS DIRS=`mktemp` find "$CUR_DIR" -mindepth 1 -maxdepth 1 -type d -regex '.*/[^.]*' | LC_ALL=C sort >$DIRS while IFS= read -r f; do ( do_test "$f" ) done <$TESTS while IFS= read -r d; do ( traverse_tests "$d" ) done <$DIRS rm $DIRS $TESTS } set_default_settings() { MAX_PROC_COUNT=1 MAX_DIM_PROC_COUNT=0 SHARE_RESOURCES=0 ALLOW_MULTIDEV=1 DVM_ONLY=0 GPU_ONLY=0 TEST_ANALYZER="$MY_DIR/default-test-analyzer.sh" MAX_TIME=300 } set_default_settings (traverse_tests "$TEST_SUITE")