#!/bin/bash
# This script installs and runs lmbench
# All parameters are passed by environment variables
P=lmbench-bench
DEFAULT_VERSION=3
. $SHELLPACK_INCLUDE/common.sh
TIME_CMD=`which time`
if [ "$TIME_CMD" = "" ]; then
        TIMEFORMAT="%2Uuser %2Ssystem %Relapsed %P%%CPU"
        TIME_CMD="time"
fi

# Basic argument parser
TASKSET_SERVER=
TASKSET_CLIENT=
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
		;;
	*)
		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

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

# Include monitor hooks
. $SHELLPACK_INCLUDE/include-monitor.sh

cd $SHELLPACK_SOURCES/lmbench-${VERSION}-installed || die Failed to cd to lmbench directory
for LMBENCH_TEST in $LMBENCH_TESTS; do
	# Prepare test
	case $LMBENCH_TEST in
	lat_mmap)
		;;
	lat_ctx)
		echo
		;;
	*)
		die "Unrecognised test $LMBENCH_TEST for preparation"
		;;
	esac

	# Run test
	monitor_pre_hook $LOGDIR_RESULTS $LMBENCH_TEST
	LMBENCH_RESULTS=$LOGDIR_RESULTS/lmbench-${LMBENCH_TEST}.log

	case $LMBENCH_TEST in
	lat_mmap)
		STRIDE=$(((LMBENCH_LATMMAP_MAX_FILESIZE-LMBENCH_LATMMAP_MIN_FILESIZE)/4))
		for FILESIZE in `seq $LMBENCH_LATMMAP_MIN_FILESIZE $STRIDE $LMBENCH_LATMMAP_MAX_FILESIZE`; do
			mmtests_activity filesize $FILESIZE
			FILESIZE=$((FILESIZE&~4095))
			dd if=/dev/zero of=$SHELLPACK_DATA/lmbench.file ibs=4096 count=$((FILESIZE/4096)) conv=fsync 2> /dev/null
			for ITERATION in `seq 1 $LMBENCH_LATMMAP_ITERATIONS`; do
				./bin/$LMBENCH_TEST \
					-N 30 \
					$FILESIZE $SHELLPACK_DATA/lmbench.file \
						2>&1 | tee -a $LMBENCH_RESULTS
			done
		done
		rm $SHELLPACK_DATA/lmbench.file
		;;
	lat_ctx)
		LMBENCH_LATCTX_SIZE=`echo $LMBENCH_LATCTX_SIZE | tr ',' ' '`
THREADS=
START_THREAD=2
END_THREAD=$LMBENCH_LATCTX_MAXCLIENTS
if [ $END_THREAD -gt 32 ]; then
	THREADS=`seq $START_THREAD 3 8`
	THREADS="$THREADS `seq 12 9 32`"
	THREADS="$THREADS `seq 48 31 $END_THREAD`"
elif [ $END_THREAD -gt 8 ]; then
	THREADS=`seq $START_THREAD 2 8`
	THREADS="$THREADS `seq 12 6 $END_THREAD`"
else
	THREADS=`seq $START_THREAD 2 $END_THREAD`
fi
if [ `echo $THREADS | awk '{print $NF}'` -ne $END_THREAD ]; then
	THREADS="$THREADS $END_THREAD"
fi

for NR_THREADS in $THREADS; do
	if [ $NR_THREADS -lt 2 ]; then
		continue
	fi
	mmtests_activity process $NR_THREADS/$END_THREAD
			for SIZE in $LMBENCH_LATCTX_SIZE; do
				mmtests_activity size $SIZE
				echo mmtests-size:$SIZE >> ${LMBENCH_RESULTS}

				for ITERATION in `seq 1 $LMBENCH_LATCTX_ITERATIONS`; do
					echo Running with $NR_THREADS threads size $SIZE iter $ITERATION/$LMBENCH_LATCTX_ITERATIONS
					./bin/$LMBENCH_TEST \
						-s $SIZE \
						$NR_THREADS 2>&1 | tee -a ${LMBENCH_RESULTS}-${SIZE}-${NR_THREADS}-${ITERATION}.raw
				done
				MIN_ITER=`grep ^[0-9] ${LMBENCH_RESULTS}-${SIZE}-${NR_THREADS}-*.raw | sort -n -k 2 | head -1 | awk -F : '{print $1}'`
				if [ "$MIN_ITER" != "" ]; then
					echo min: $MIN_ITER
					cat $MIN_ITER | tee -a ${LMBENCH_RESULTS}
				else
					echo mmtests-no-samples: $NR_THREADS $SIZE | tee -a ${LMBENCH_RESULTS}
				fi
			done
done
		;;
	*)
		die "Unrecognised test $LMBENCH_TEST for execution"
		;;
	esac
	monitor_post_hook $LOGDIR_RESULTS $LMBENCH_TEST 

	rm -f $SHELLPACK_DATA/lmbench.file 2> /dev/null
done

exit $SHELLPACK_SUCCESS
#### Description lmbench
#### Details lmbench-bench 56
