#!/bin/bash
# This is the script for running SPECcpu
P=speccpu2017-bench
DEFAULT_VERSION=1.0.5
. $SHELLPACK_INCLUDE/common.sh
TIME_CMD=`which time`
if [ "$TIME_CMD" = "" ]; then
        TIMEFORMAT="%2Uuser %2Ssystem %Relapsed %P%%CPU"
        TIME_CMD="time"
fi

SPECCPU_DATA_SIZE=ref
SPECCPU_ITERATIONS=3
SPECCPU_TESTS=specspeed

install-depends dmidecode gcc gcc-c++ gcc-fortran

# Basic argument parser
TASKSET_SERVER=
TASKSET_CLIENT=
TASKSET_ALL=
SERVERSIDE_COMMAND=none
SERVERSIDE_NAME=`date +%Y%m%d-%H%M-%S`

while [ "$1" != "" ]; do
	case "$1" in
	-v)
		VERSION=$2
		shift 2
		;;
	--serverside-command)
		SERVERSIDE_COMMAND=$2
		shift 2
		;;
	--serverside-name)
		SERVERSIDE_NAME=$2
		shift 2
		;;
	--install-only)
		INSTALL_ONLY=yes
		shift
		;;
	--install-force)
		INSTALL_FORCE=yes
		shift
		;;
	--input-data-size)
		SPECCPU_DATA_SIZE=$2
		shift 2
		;;
	--iterations)
		SPECCPU_ITERATIONS=$2
		shift 2
		;;
	--tests)
		SPECCPU_TESTS=$2
		shift 2
		;;
	--parallel)
		SPECCPU_PARALLEL=$2
		shift 2
		;;
	--build)
		SPECCPU_BUILDONLY=yes
		shift
		;;
	*)
		echo Unrecognised option: $1
		shift
	esac
done
if [ "$TASKSET_SERVER" != "" ]; then
	echo TASKSET_SERVER: $TASKSET_SERVER
	echo TASKSET_CLIENT: $TASKSET_CLIENT
fi
if [ -z "$VERSION" ]; then
	VERSION=$DEFAULT_VERSION
fi

# Detect bitness
case `uname -m` in
	i?86)
		RUNBITS=32
		;;
	*)
		RUNBITS=64
		;;
esac

# Detect whether it is reportable
REPORTABLE=--reportable
if [ "$TESTS" != "specspeed" -a "$TESTS" != "specrate" ]; then
	if [ "$SPECCPU_ITERATIONS" = "1" -o "$SPECCPU_DATA_SIZE" != "ref" ]; then
		REPORTABLE=--noreportable
	fi
fi

if [ "$INSTALL_FORCE" = "yes" ]; then
	rm -rf $SHELLPACK_SOURCES/speccpu2017-${VERSION}
fi
if [ ! -d $SHELLPACK_SOURCES/speccpu2017-${VERSION}-installed ]; then
	mmtests_activity source-install
	$SHELLPACK_INCLUDE/shellpack-install-speccpu2017 -v ${VERSION}  || die speccpu2017 install script returned error
	mmtests_activity source-installed
fi
cd $SHELLPACK_SOURCES/speccpu2017-${VERSION}-installed || die Failed to cd to speccpu2017 install directory
if [ "$INSTALL_ONLY" = "yes" ]; then
	echo speccpu2017 installed only as requested.
	exit $SHELLPACK_SUCCESS
fi
# Include monitor hooks
. $SHELLPACK_INCLUDE/include-monitor.sh

# Prepare system
cd $SHELLPACK_SOURCES/speccpu2017-${VERSION}-installed > /dev/null || die Failed to cd to speccpu
[ ! -e shrc ] && die No speccpu2017 shrc script
[ -e result ] && rm -rf result
. shrc
mkdir -p config

# Generate SPEC configurations
if [ ! -e  config/gen-m${RUNBITS}.cfg ]; then
	echo Auto-generating speccpu 2017 file
	generate-speccpu2017.sh			\
		--spectype $SPECCPU_TESTS	\
		--bitness ${RUNBITS}		\
		--parallel $SPECCPU_PARALLEL	\
		--iterations $SPECCPU_ITERATIONS > config/gen-m${RUNBITS}.cfg || die Failed to generate spec config file
fi

# For parallel speed runs, only run fpspeed and not intspeed. According to the
# documentation, only one intspeed benchmark (657.xz_s) supports openmp so
# it's a waste of time to run the full suite.
if [ "$SPECCPU_TESTS" = "specspeed" ]; then
	if [ $SPECCPU_PARALLEL -gt 1 ]; then
		echo WARNING:
		echo WARNING: Limiting parallelised specspeed test to fpspeed as only one
		echo WARNING: intspeed benchmark supports openmp parallelisation.
		echo WARNING:
		SPECCPU_TESTS="fpspeed"
	fi
fi

# Prebuild everything if requested
if [ "$SPECCPU_BUILDONLY" = "yes" ]; then
	mmtests_activity source-install
	echo Prebuilding $SPECCPU_TESTS
	$MMTESTS_HUGECTL runcpu --config gen-m${RUNBITS}.cfg	\
		$REPORTABLE					\
		--tune base					\
		--size $SPECCPU_DATA_SIZE			\
		--iterations $SPECCPU_ITERATIONS		\
		--action=build $SPECCPU_TESTS || die Failed to build spec

	echo Speccpu 2017 build-only for $SPECCPU_TESTS complete
	exit $SHELLPACK_SUCCESS
fi

# Remove stack size limits or cam4_s will fail. A fixed size could be used
# but xz and cam4_s disagree on what that size should be when parallelised.
ulimit -s unlimited

# Run the benchmark
mmtests_activity runcpu
$MMTESTS_HUGECTL runcpu --config gen-m${RUNBITS}.cfg	\
	$REPORTABLE					\
	--tune base					\
	--size $SPECCPU_DATA_SIZE			\
	--iterations $SPECCPU_ITERATIONS		\
	$SPECCPU_TESTS
RETVAL=$?
mv result/* $LOGDIR_RESULTS/
gzip $LOGDIR_RESULTS/*.log

exit $RETVAL
#### Description speccpu2017
#### Details speccpu2017-bench 16
