Files
SAPFOR/dvm/tools/tester/trunk/main/perform-tests.sh

353 lines
13 KiB
Bash
Raw Normal View History

2024-05-02 17:08:55 +03:00
#!/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")