blob: 4d2134a740f80a5bc4acfdb30ebdf190b4e82781 [file] [log] [blame]
#!/bin/bash
#
# Copyright (C) 2006-2011 Princeton University
# All rights reserved.
# Author: Christian Bienia
#
# parsecmgmt - A tool to manage the PARSEC benchmark suite
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of Princeton University nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY CHRISTIAN BIENIA ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL CHRISTIAN BIENIA BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# CHANGELOG
#
# From PARSEC 2.1 to PARSEC 3.0:
# - Added package configuration files and eliminated central parsec.conf file
# - Make parsecmgmt display more information about packages
#
# From PARSEC 2.0 to PARSEC 2.1:
# - Made PARSECPLAT string detection more robust
# - Place log files in separate log/${PARSECPLAT} subdirectories
# - Always append build config name to PARSECPLAT
#
# From PARSEC 1.0 to PARSEC 2.0:
# - parsecmgmt now adds '$CC_HOME/lib' and '$CC_HOME/lib64' to LD_LIBRARY_PATH
# - file 'compile-info' renamed to 'build-info'
# - option `-x' added to append extention to platform descriptor string
# - option `-k' to keep run directory
# - eliminated need for "inputs" list from file parsec.conf
# - auto-detect available aliases and packages
# - conditional package dependencies (also depend on build configuration now)
# - Renamed action `uninstallall' to `fulluninstall'
# - Renamed action `cleanall' to `fullclean'
#################################################################
# #
# CONFIGURATION #
# #
#################################################################
# Define directory of PARSEC benchmark suite
# If $PARSECDIR is not set, the script tries to autodetect the path
#export PARSECDIR=""
# Define platform name to use
# If $PARSECPLAT is not set, the script will automaticaly determine a name
#export PARSECPLAT=""
# Should output be logged? Anything other than "TRUE" will turn off logging
create_log="TRUE"
##### There should be no need to touch anything below here #####
# Output prefix to use
oprefix="[PARSEC]"
#################################################################
# #
# FUNCTIONS #
# #
#################################################################
# parsec_init
#
# Initialize the script
#
# Arguments: none
function parsec_init {
# We need to hard-wire a few commands because we need them for the path detection
PWD="pwd"
BASENAME="basename"
DIRNAME="dirname"
# Determine script name
eval me=$(${BASENAME} $0)
# Try to find path
uniquefile=".parsec_uniquefile"
parsecdir=""
if [ ! -z "${PARSECDIR}" ]; then
# User defined PARSECDIR, check it
parsecdir="${PARSECDIR}"
if [ ! -f "${parsecdir}/${uniquefile}" ]; then
echo "${oprefix} Error: Variable PARSECDIR points to '${PARSECDIR}', but this does not seem to be the PARSEC directory. Either unset PARSECDIR to make me try to autodetect the path or set it to the correct value."
exit 1
fi
else
# Try to autodetect path by looking at path used to invoke this script
# Try to extract absoute or relative path
if [ "${0:0:1}" == "/" ]; then
# Absolute path given
eval parsecdir=$(${DIRNAME} $(${DIRNAME} $0))
# Check
if [ -f "${parsecdir}/${uniquefile}" ]; then
PARSECDIR=${parsecdir}
fi
else
# No absolute path, maybe relative path?
eval parsecdir=$(${PWD})/$(${DIRNAME} $(${DIRNAME} $0))
# Check
if [ -f "${parsecdir}/${uniquefile}" ]; then
PARSECDIR=${parsecdir}
fi
fi
# If PARSECDIR is still undefined, we try to guess the path
if [ -z "${PARSECDIR}" ]; then
# Check current directory
if [ -f "./${uniquefile}" ]; then
parsecdir="$(${PWD})"
PARSECDIR=${parsecdir}
fi
fi
if [ -z "${PARSECDIR}" ]; then
# Check next-higher directory
if [ -f "../${uniquefile}" ]; then
parsecdir="$(${PWD})/.."
PARSECDIR=${parsecdir}
fi
fi
fi
# Make sure PARSECDIR is defined and exported
if [ -z "${PARSECDIR}" ]; then
echo "${oprefix} Error: Unable to autodetect path to the PARSEC benchmark suite. Either define an environment variable PARSECDIR, or edit ${me} and set PARSECDIR to the correct value at the beginning of the file."
exit 1
fi
export PARSECDIR
# Eliminate trailing `/.' from PARSECDIR
PARSECDIR=${PARSECDIR/%\/./}
# Determine OS name to use for automatically determined PARSECPLAT
case "${OSTYPE}" in
*linux*) ostype="linux";;
*solaris*) ostype="solaris";;
*bsd*) ostype="bsd";;
*aix*) ostype="aix";;
*hpux*) ostype="hpux";;
*irix*) ostype="irix";;
*amigaos*) ostype="amigaos";;
*beos*) ostype="beos";;
*bsdi*) ostype="bsdi";;
*cygwin*) ostype="windows";;
*darwin*) ostype="darwin";;
*interix*) ostype="interix";;
*os2*) ostype="os2";;
*osf*) ostype="osf";;
*sunos*) ostype="sunos";;
*sysv*) ostype="sysv";;
*sco*) ostype="sco";;
*) ostype="${OSTYPE}";;
esac
# Determine HOST name to use for automatically determined PARSECPLAT
case "${HOSTTYPE}" in
*i386*) hosttype="i386";;
*x86_64*) hosttype="amd64";;
*amd64*) hosttype="amd64";;
*i486*) hosttype="amd64";;
*sparc*) hosttype="sparc";;
*sun*) hosttype="sparc";;
*ia64*) hosttype="ia64";;
*itanium*) hosttype="ia64";;
*powerpc*) hosttype="powerpc";;
*ppc*) hosttype="powerpc";;
*alpha*) hosttype="alpha";;
*mips*) hosttype="mips";;
*arm*) hosttype="arm";;
*) hosttype="${HOSTTYPE}";;
esac
# Determine first part of value to use for PARSECPLAT environment variable if not defined by user
# Note: We will append the compiler configuration to that to get the final value for PARSECPLAT
hostostype="${hosttype}-${ostype}"
# Define some global directories
benchdir=${parsecdir}/pkgs
logdir=${parsecdir}/log
# Try to load OS-specific configuration to get binaries and correct arguments
sysconfig="${PARSECDIR}/config/${ostype}.sysconf"
if [ -f "${sysconfig}" ]; then
source ${sysconfig}
else
echo "${oprefix} Error: Cannot load system configuration file '${sysconfig}' for OS type '${ostype}'. Please create a new system configuration file."
exit 1
fi
# Setup environment so PARSEC tools are usable by other programs
if [ -z "${PATH}" ]; then
export PATH="${PARSECDIR}/bin"
else
export PATH="${PARSECDIR}/bin:${PATH}"
fi
# Build list of aliases from package configurations
list_of_aliases=""
for file in ${PARSECDIR}/config/packages/*.*.pkgconf; do
source $file
# Append unique aliases to global list, build package list for each alias
for newalias in ${pkg_aliases}; do
local is_duplicate=""
for alias in ${list_of_aliases}; do
if [[ "$newalias" == "$alias" ]]; then
is_duplicate=TRUE
break
fi
done
# Initialize new aliases
if [[ "$is_duplicate" != "TRUE" ]]; then
list_of_aliases="$list_of_aliases $newalias"
eval alias_${newalias}=\"\"
fi
is_duplicate=""
# Append package to alias list
local pkg
local pkglist
eval pkg=$(${BASENAME} $file)
pkg=${pkg%\.pkgconf}
# Add prefex ('parsec' or 'splash2')to the pkg
pkg=${pkg/\./_}
eval pkglist=\"\$alias_${newalias}\"
eval alias_${newalias}=\"$pkglist $pkg\"
done
done
}
# process_args
#
# Process args and setup argument-dependent environment
#
# Arguments: all arguments given to the script (i.e. "$@")
function process_args {
# Default configuration to use
default_pkgs="parsec splash2 splash2x"
default_build="gcc"
default_rundir="${PARSECDIR}"
default_inputsize="test"
default_nthreads="1"
default_submit="time"
# Usage
usage="\
Usage: $me -a ACTION [OPTION]...
Manage the installation of the PARSEC benchmark suite.
Options:
-a ACTION Specifies the action to perform. See below for a
list of valid actions.
-p PACKAGE A list of packages or aliases on which the action is to be
performed.
-c CONFIG Which build configuration to use. Default: '$default_build'
-d RUNDIR Use directory RUNDIR as root in which to run the
benchmarks.
-i INPUT The input to use to run the benchmarks. Default: '$default_inputsize'
-n THREADS The minimum number of threads to use. Default: '$default_nthreads'
-s SUBMIT Command to use to submit the benchmark for execution.
Default: '$default_submit'
-x EXTENSION Extension to append to platform descriptor string.
Default: none
-k Keep & use run directory as found, do not unpack inputs for
benchmark execution. Assume everything is already set up.
-m NETMODE Execution mode for network workloads.
NETMODE can be either 'server' or 'client'.
-t THREADS The number of user threads talking to the upTCP/IP stack. Default: '1'
-r THREADS The number of TCP/IP protocol receving threads. Default: '1'
-l Disable log.
-h Displays this help message.
Actions:
'build' Builds and installs the specified packages.
'run' Runs the specified packages.
'clean' Removes all files generated during the build and run phase
of the listed packages for the current platform, but
leaves the installed files untouched.
'uninstall' Removes the installed files of the listed packages for the
current platform.
'fullclean' Like 'clean', but for all architectures.
'fulluninstall' Like 'uninstall', but for all architectures.
'status' Shows a summary of the current status of the PARSEC
installation.
'info' List available packages and configurations.
Examples (1) [Compatible to PARSEC 2.1 but Extended]:
- Build all benchmarks of three suites, i.e., PARSEC, SPLASH-2 and SPLASH-2x:
$me -a build -p all
- Build only applications, use 'icc' as build configuration:
$me -a build -c icc -p apps
- Do a full cleanup after a build or benchmark run:
$me -a fullclean -p all
- Remove all generated files of the current architecture:
$me -a uninstall -p all
- Run benchmark 'ferret' w/ input 'simsmall' and 4 threads:
$me -a run -p ferret -i simsmall -n 4
- Get a quick summary of all available packages and features:
$me -a info
- Show which kernel binaries have been installed:
$me -a status -p kernels
Examples (2) [NEW: Network Benchmarks]:
- Check the status of all components involved in network benchmarks:
$me -a status -p netapps
- Build network benchmark 'netstreamcluster':
$me -a build -p raytrace
- Build all network benchmark:
$me -a build -p netapps
- Run network benchmark 'netdedup' w/ input 'native' and 2 server threads:
$me -a run -p netdedup -i native -n 2
- Run network benchmark 'netferret' w/ input 'simlarge', 4 server threads and 2 client connections:
$me -a run -p netferret -i simlarge -n 4 -t 2
- For simulation, run 'netdedup' server on a simulator w/ 4 threads and run client on a real machine:
$me -a run -p netdedup -i simlarge -n 4 -m server
$me -a run -p netdedup -i simlarge -m client
- Do a full cleanup for network benchmarks:
$me -a fullclean -p netapps
Examples (3) [NEW: SPLASH-2 Suite and SPLASH-2x Suite]:
- Check the status of SPLASH-2 suite and SPLASH-2x suite:
$me -a status -p splash2
$me -a status -p splash2x
- Build benchmark 'raytrace' from SPLASH-2x suite other than PARSEC:
$me -a build -p splash2x.raytrace
$me -a build -p raytrace ## defaultly from PARSEC (for comparison)
- Build benchmark 'fft' from SPLASH-2 suite with 'gcc-serial' build configuration:
$me -a build -c gcc-serial -p splash2.fft
- Build all benchmarks from SPLASH-2 suite and SPLASH-2x suite:
$me -a build -p splash2
$me -a build -p splash2x
- Run benchmark 'fft' from SPLASH-2x w/ input 'simsmall' and 4 threads:
$me -a run -p splash2x.fft -i simsmall -n 4
- Do a full cleanup for SPLASH-2 suite
$me -a fullclean -p splash2"
# Define valid actions
valid_actions="build run clean uninstall fullclean fulluninstall status info"
# Parse arguments
parsemode="none"
need_arg_for=""
action=""
pkgs=""
build=""
rundir=""
inputsize=""
netmode=""
nthreads=""
userthreads=""
rxthreads=""
submit=""
extension=""
extcmd=""
keep_rundir=""
while [ ! -z "$1" ]; do
arg="$1"
case "${arg}" in
"-a" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-a'"
echo "${usage}"
exit 1
fi
if [ ! -z "${action}" ]; then
echo "${oprefix} Error: Two actions specified"
exit 1
fi
need_arg_for="-a"
parsemode="ACTION";;
"-p" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-p'"
echo "${usage}"
exit 1
fi
need_arg_for="-p"
parsemode="PKGS";;
"-c" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-c'"
echo "${usage}"
exit 1
fi
need_arg_for="-c"
parsemode="CONFIG";;
"-d" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-d'"
echo "${usage}"
exit 1
fi
need_arg_for="-d"
parsemode="RUNDIR";;
"-i" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-i'"
echo "${usage}"
exit 1
fi
need_arg_for="-i"
parsemode="INPUT";;
"-n" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-n'"
echo "${usage}"
exit 1
fi
need_arg_for="-n"
parsemode="NTHREADS";;
"-t" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-t'"
echo "${usage}"
exit 1
fi
need_arg_for="-t"
parsemode="USERTHREADS";;
"-r" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-r'"
echo "${usage}"
exit 1
fi
need_arg_for="-r"
parsemode="RXTHREADS";;
"-s" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-s'"
echo "${usage}"
exit 1
fi
need_arg_for="-s"
parsemode="SUBMIT";;
"-x" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-x'"
echo "${usage}"
exit 1
fi
need_arg_for="-x"
parsemode="EXTENSION";;
"-X" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-X'"
echo "${usage}"
exit 1
fi
need_arg_for="-X"
parsemode="EXTCMD";;
"-m" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-m'"
echo "${usage}"
exit 1
fi
need_arg_for="-m"
parsemode="NETMODE";;
"-k" )
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-k'"
echo "${usage}"
exit 1
fi
keep_rundir="yes";;
"-h" )
echo "${usage}"
exit 0;;
"-l" )
create_log="FALSE";;
* )
if [ ${arg:0:1} == "-" ]; then
echo "${oprefix} Error: Unknown argument '${arg}'"
echo "${usage}"
exit 1
fi
need_arg_for=""
case "${parsemode}" in
"ACTION" )
parsemode="none"
# Check whether specified action is valid
is_valid=""
for valid_action in ${valid_actions}; do
if [ "${arg}" == "${valid_action}" ]; then
is_valid="TRUE"
break
fi
done
if [ -z "$is_valid" ]; then
echo "${oprefix} Error: Unknown action '${arg}'."
echo "${usage}"
exit 1
fi
action="${arg}";;
"PKGS" )
# Check whether specified package is valid
is_valid=""
# Is it a recognized alias?
tmparg=""
tmparg=${arg/\./_} #arg could be "splash2" or "splash2.fmm"
if [ ${tmparg} == ${arg} ]; then
eval tmparg="\"\${alias_${arg}}\""
if [ ! -z "${tmparg}" ]; then
is_valid="TRUE"
else # parsec pkg
tmparg=parsec_${arg}
arg=parsec.${arg}
fi
fi
# Is it a recognized package?
if [[ -e "${PARSECDIR}/config/packages/${arg}.pkgconf" ]]; then
is_valid="TRUE"
fi
# Interpret result
if [ -z "$is_valid" ]; then
echo "${oprefix} Error: Invalid package '${arg}'."
exit 1
fi
pkgs="${pkgs} ${tmparg}";;
"CONFIG" )
parsemode="none"
# Check whether specified config file exists
buildfile="${PARSECDIR}/config/${arg}.bldconf"
if [ ! -f "${buildfile}" ]; then
echo "${oprefix} Error: Cannot find build configuration file '${buildfile}'."
exit 1
fi
build="${arg}";;
"RUNDIR" )
parsemode="none"
# Check whether specified run directory exists
if [ ! -d "${arg}" ]; then
echo "${oprefix} Error: Cannot find directory '${arg}'."
exit 1
fi
rundir="${arg}";;
"INPUT" )
parsemode="none"
# Check whether specified input set exists
runconfigfile="${PARSECDIR}/config/${arg}.runconf"
if [ ! -f "${runconfigfile}" ]; then
echo "${oprefix} Error: Unknown input set '${arg}'."
exit 1
fi
inputsize="${arg}";;
"NTHREADS" )
parsemode="none"
declare -i nthreads
nthreads="${arg}"
# Note: This check also filters out strings (nthreads==0 in that case)
if [ "${nthreads}" -lt "1" ]; then
echo "${oprefix} Error: Illegal number of threads: '${arg}'."
echo "${usage}"
exit 1
fi;;
"USERTHREADS" )
parsemode="none"
userthreads="${arg}"
# Note: This check also filters out strings (userthreads==0 in that case)
if [ "${userthreads}" -lt "1" ]; then
echo "${oprefix} Error: Illegal number of user threads: '${arg}'."
echo "${usage}"
exit 1
fi;;
"RXTHREADS" )
parsemode="none"
rxhreads="${arg}"
# Note: This check also filters out strings (rxthreads==0 in that case)
if [ "${rxthreads}" -lt "1" ]; then
echo "${oprefix} Error: Illegal number of receiving threads: '${arg}'."
echo "${usage}"
exit 1
fi;;
"SUBMIT" )
parsemode="none"
# Check whether specified program exists
cmd=$(echo "${arg}" | awk '{print $1}')
if [ ! -e "${cmd}" ]; then
# Check whether program is in path and give it a second try
cmd=$(which ${cmd}); rv=$?
if [ ! $rv -eq 0 ]; then
echo "${oprefix} Error: Cannot find file '${arg}'."
exit 1
fi
fi
# Check whether specified file is executable
if [ ! -x "${cmd}" ]; then
echo "${oprefix} Error: '${arg}' is not executable."
exit 1
fi
submit="${arg}";;
"EXTENSION" )
parsemode="none"
extension="${arg}";;
"EXTCMD" )
parsemode="none"
extpkg="${arg}"
extcmd="${PARSECDIR}/toolkit/${extpkg}/${extpkg}.sh ${PARSECDIR}/toolkit/${extpkg}/parameter.cfg &"
eval ${extcmd}
echo ""
echo "NOTE: The external package ${extpkg} is running in background. Please check results later."
echo ""
exit 0;;
"NETMODE" )
parsemode="none"
if [ ! ${arg} == "server" ] && [ ! ${arg} == "client" ]; then
echo "illegal value for NETMODE: NETMODE should be either 'server' or 'client'"
exit 1
fi
netmode="${arg}";;
* )
echo "${oprefix} Error: Unknown argument '${arg}'"
echo "${usage}"
exit 1;;
esac;;
esac
shift
done
if [ ! -z "${need_arg_for}" ]; then
echo "${oprefix} Error: ${parsemode} expected after '${need_arg_for}'"
echo "${usage}"
exit 1
fi
# Make sure we have an action and at least one package
if [ -z "${action}" ]; then
echo "${oprefix} Error: No action specified."
echo "${usage}"
exit 1
fi
if [ -z "${pkgs}" ]; then
# Is it a recognized alias?
for arg in ${default_pkgs} ; do
tmparg=""
tmparg=${arg/\./_} #arg could be "splash2" or "splash2.fmm"
if [ ${tmparg} == ${arg} ]; then
eval tmparg="\"\${alias_${arg}}\""
if [ -z "${tmparg}" ]; then
tmparg=parsec_${arg}
arg=parsec.${arg}
fi
fi
pkgs="${pkgs} ${tmparg}"
done
fi
# Set NTHREADS
if [ -z "${nthreads}" ]; then
# Use default value
NTHREADS="${default_nthreads}"
else
NTHREADS="${nthreads}"
fi
# Set rundir
if [ -z "${rundir}" ]; then
# Use default value
rundir="${default_rundir}"
fi
# Set input size
if [ -z "${inputsize}" ]; then
# Use default value
inputsize="${default_inputsize}"
fi
# Set submit program
if [ -z "${submit}" ]; then
# Use default value
submit="${default_submit}"
fi
# Determine build
if [ -z "${build}" ]; then
build="${default_build}"
fi
# Define PARSECPLAT, if not set by user
if [ -z "${PARSECPLAT}" ]; then
PARSECPLAT=${hostostype}.${build}
else
PARSECPLAT=${PARSECPLAT}.${build}
fi
# Append extension if specified
if [ ! -z "${extension}" ]; then
PARSECPLAT=${PARSECPLAT}.${extension}
fi
export PARSECPLAT
# Load build configuration
if [ "${action}" == "build" -o "${action}" == "run" ]; then
buildfile="${PARSECDIR}/config/${build}.bldconf"
if [ -f "${buildfile}" ]; then
source ${buildfile}
else
echo "${oprefix} Error: Cannot find build configuration file '${buildfile}'."
exit 1
fi
fi
# Expand aliases to get full list of packages to build
# there are three kinds of token in $pkgs:
# 1) parsec_pthread, parsec_opemmp, etc. alias, remove "parsec_" and just expand them
# 2) parsec_streamcluster etc. not alias but parsec workloads, just add them
# 3) splash2_raytrace, splash2_xxx. not alias but splash2 workloads, just add them
expanded_aliases=""
for token in ${pkgs}; do
# Is it a recognized alias?
local tmpbench
tmpbench=${token:0:5}
if [ $tmpbench == "parsec" ]; then
local tmppkg
tmppkg=${token:7}
eval temp="\"\${alias_${tmppkg}}\""
if [ ! -z "${temp}" ]; then
# Yes it is, expand alias
expanded_aliases="${expanded_aliases} ${temp}"
else
# Otherwise keep it in the list
expanded_aliases="${expanded_aliases} ${token}"
fi
else
expanded_aliases="${expanded_aliases} ${token}"
fi
done
# Rebuild list with packages, remove duplicate packages
pkgs=""
pkgs_nonapps="${alias_tools} ${alias_libs}"
for pkg in $expanded_aliases; do
is_included=""
local tmppkg
# restore to xxxx.xxxx format
tmppkg=${pkg/_/\.}
for dummy in $pkgs; do
if [ "$tmppkg" == "$dummy" ]; then
is_included="TRUE"
break
fi
done
if [ "${action}" == "run" ]; then
for tmppkg2 in ${pkgs_nonapps}; do
tmppkg3=${tmppkg2/_/\.}
if [ "${tmppkg3}" == "$tmppkg" ]; then
is_included="TRUE"
break
fi
done
fi
if [ -z "$is_included" ]; then
pkgs="${pkgs} ${tmppkg}"
fi
done
# Initialize logging functionality
logfile=""
if [ "${action}" == "build" ]; then
eval logfile="build_\$(${LOGDATE}).log"
elif [ "${action}" == "run" ]; then
eval logfile="run_${NTHREADS}_${inputsize}_\$(${LOGDATE}).log"
fi
if [ "$create_log" == "TRUE" ] && [ ! -z "$logfile" ]; then
${MKDIR} ${logdir}/${PARSECPLAT}
log=${logdir}/${PARSECPLAT}/${logfile}
else
log="/dev/null"
fi
}
# build_info
#
# Create a text file containing information about the build.
# Assumes that all relevant configuration files have already been sourced.
#
# Arguments: $1 - Package name
# $2 - The name of the text file to create
function build_info {
if [ -z "$1" ]; then
echo "${oprefix} Error: build_info called with no arguments." 2>&1 | ${TEE} ${log}
exit 1
fi
local package_name="$1"
if [ -z "$2" ]; then
echo "${oprefix} Error: build_info called with insufficient number of arguments." 2>&1 | ${TEE} ${log}
exit 1
fi
local cinfo_file="$2"
echo "PARSEC Compile Information" > ${cinfo_file}
echo "==========================" >> ${cinfo_file}
echo "Package '${package_name}'" >> ${cinfo_file}
eval echo "Built on \$(${DATE})" >> ${cinfo_file}
echo >> ${cinfo_file}
# Package-specific build information
local env_package="${build_env}"
local build_conf_package="${build_conf} ${build_conf_global}"
echo "Configure arguments: ${build_conf_package}" >> ${cinfo_file}
echo >> ${cinfo_file}
echo "Environment modifications: ${env_package}" >> ${cinfo_file}
echo >> ${cinfo_file}
echo "CC: ${CC}" >> ${cinfo_file}
echo "Version: ${CC_ver}" >> ${cinfo_file}
echo "CFLAGS: ${CFLAGS}" >> ${cinfo_file}
echo >> ${cinfo_file}
echo "CXX: ${CXX}" >> ${cinfo_file}
echo "Version: ${CXX_ver}" >> ${cinfo_file}
echo "CXXFLAGS: ${CXXFLAGS}" >> ${cinfo_file}
echo >> ${cinfo_file}
echo "CCAS: ${CCAS}" >> ${cinfo_file}
echo "Version: ${CCAS_ver}" >> ${cinfo_file}
echo "CCASFLAGS: ${CCASFLAGS}" >> ${cinfo_file}
echo >> ${cinfo_file}
echo "LD: ${LD}" >> ${cinfo_file}
echo "Version: ${LD_ver}" >> ${cinfo_file}
echo "LDFLAGS: ${LDFLAGS}" >> ${cinfo_file}
echo >> ${cinfo_file}
echo "JAVAC: ${JAVAC}" >> ${cinfo_file}
echo "Version: ${JAVAC_ver}" >> ${cinfo_file}
echo "JFLAGS: ${JFLAGS}" >> ${cinfo_file}
echo >> ${cinfo_file}
echo "[EOF]" >> ${cinfo_file}
}
# build_package
#
# Build a software package and recursively all packages it depends on
#
# Arguments: $1 - The package name
function build_package {
if [ -z "$1" ]; then
echo "${oprefix} Error: build_package called with no arguments." 2>&1 | ${TEE} ${log}
exit 1
fi
local pkg=$1
echo "${oprefix} [---------- Analyzing package ${pkg} ----------]" 2>&1 | ${TEE} ${log}
# Load package configuration
source ${PARSECDIR}/config/packages/${pkg}.pkgconf
# Define package-specific directories
if [ -z "$pkg_group" ]; then
echo "${oprefix} Error: Group of package ${pkg} is unknown." 2>&1 | ${TEE} ${log}
exit 1
fi
# determine top directory
local bench
bench=`expr match ${pkg} '\(.*\.\)'`
eval pkgname="${pkg#${bench}}"
bench=${bench%\.}
if [ ${bench} == "parsec" ]; then
benchdir="pkgs"
else
eval benchdir="ext\/${bench}"
fi
local pkgdir=${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}
local pkgsrcdir=${pkgdir}/src
local pkgobjdir=${pkgdir}/obj/${PARSECPLAT}
local pkginstdir=${pkgdir}/inst/${PARSECPLAT}
local pkgparsecdir=${pkgdir}/parsec
# Check whether package has already been built
if [ -f "${pkginstdir}/build-info" ]; then
echo "${oprefix} Package ${pkg} already exists, proceeding." 2>&1 | ${TEE} ${log}
return 0
fi
# Source local build configuration to get dependencies
if [ ! -f "${pkgparsecdir}/${build}.bldconf" ]; then
echo "${oprefix} Error: Cannot find local build configuration '${build}.bldconf' for package ${pkg}." 2>&1 | ${TEE} ${log}
exit 1
else
source ${pkgparsecdir}/${build}.bldconf
fi
# Build packages on which pkg depends
if [ -z "${build_deps}" ]; then
echo "${oprefix} ${pkg} does not depend on any other packages." 2>&1 | ${TEE} ${log}
else
echo "${oprefix} ${pkg} depends on: ${build_deps}" 2>&1 | ${TEE} ${log}
fi
local dep=""
for dep in ${build_deps}; do
local tmpdep
local index
tmpdep=${dep}
eval index=`expr "${dep}" : '\.'`
if [ $index -eq 0 ]; then
eval tmpdep="parsec.${dep}"
fi
build_package "${tmpdep}"
done
# Now build pkg itself
echo "${oprefix} [---------- Building package ${pkg} ----------]" 2>&1 | ${TEE} ${log}
# Source local package build configuration again (might have gotten overwritten by recursion)
if [ ! -f "${pkgparsecdir}/${build}.bldconf" ]; then
echo "${oprefix} Error: Cannot find local build configuration '${build}.bldconf' for package ${pkg}." 2>&1 | ${TEE} ${log}
exit 1
else
source ${pkgparsecdir}/${build}.bldconf
fi
# Check for obvious errors
if [ -z "${build_inplace}" ]; then
echo "${oprefix} Variable 'build_inplace' for package '${benchmark}' has not been set in file '${build}.bldconf'." | ${TEE} ${log}
exit 1
fi
# Global arguments to configure script
build_conf_global="--prefix=${pkginstdir}"
# We need either configure or a Makefile
if [ ! -x ${pkgsrcdir}/configure -a ! -f ${pkgsrcdir}/[Mm]akefile ]; then
echo "${oprefix} Error: Need 'configure' script or a '[Mm]akefile' to build package ${pkg}." 2>&1 | ${TEE} ${log}
exit 1
fi
# Remove an already existing build directory
if [ -e "${pkgobjdir}" ]; then
echo "${oprefix} Removing old build directory." 2>&1 | ${TEE} ${log}
${RM} ${pkgobjdir}
fi
# Set up build directory
if [ "${build_inplace}" == "TRUE" ]; then
local pkgbuildsrcdir=${pkgobjdir}
echo "${oprefix} Copying source code of package ${pkg}." 2>&1 | ${TEE} ${log}
${MKDIR} ${pkgobjdir} > /dev/null
${CP} ${pkgsrcdir}/* ${pkgobjdir}
else
local pkgbuildsrcdir=${pkgsrcdir}
${MKDIR} ${pkgobjdir} > /dev/null
fi
pushd ${pkgobjdir} > /dev/null
# Run configure
if [ -x ${pkgbuildsrcdir}/configure ]; then
local build_conf_pkg="${build_conf} ${build_conf_global}"
# Current pwd is $pkgobjdir
if [ "${pkgobjdir}" == "${pkgbuildsrcdir}" ]; then
local configcmd="env ${build_env} ./configure ${build_conf_pkg}"
else
local configcmd="env ${build_env} ${pkgbuildsrcdir}/configure ${build_conf_pkg}"
fi
eval echo "${oprefix} Running \'${configcmd}\':" 2>&1 \| ${TEE} ${log}
eval \( ${configcmd} 2>&1 \) 2>&1 \| ${TEE} ${log} \; retval=\${PIPESTATUS[0]}
if [ "$retval" -ne "0" ]; then
eval echo "${oprefix} Error: \'${configcmd}\' failed." 2>&1 \| ${TEE} ${log}
popd > /dev/null
exit 1
fi
fi
# Make sure a Makefile exists in the build directory
if [ ! -f ${pkgobjdir}/[Mm]akefile ]; then
echo "${oprefix} Error: Cannot find Makefile in ${pkgobjdir}" 2>&1 | ${TEE} ${log}
popd > /dev/null
exit 1
fi
# Run make
local makecmd="env ${build_env} ${MAKE}"
eval echo "${oprefix} Running \'$makecmd\':" 2>&1 \| ${TEE} ${log}
eval \( ${makecmd} 2>&1 \) 2>&1 \| ${TEE} ${log} \; retval=\${PIPESTATUS[0]}
if [ "$retval" -ne "0" ]; then
eval echo "${oprefix} Error: \'${makecmd}\' failed." 2>&1 \| ${TEE} ${log}
popd > /dev/null
exit 1
fi
# Run make install
${MKDIR} ${pkginstdir} > /dev/null
local makecmd="env ${build_env} ${MAKE} install"
eval echo "${oprefix} Running \'$makecmd\':" 2>&1 \| ${TEE} ${log}
eval \( ${makecmd} 2>&1 \) 2>&1 \| ${TEE} ${log} \; retval=\${PIPESTATUS[0]}
if [ "$retval" -ne "0" ]; then
eval echo "${oprefix} Error: \'${makecmd}\' failed." 2>&1 \| ${TEE} ${log}
popd > /dev/null
exit 1
fi
popd > /dev/null
pushd ${pkginstdir} > /dev/null
# Create build info file
build_info ${pkg} ${pkginstdir}/build-info
# Finish up
popd > /dev/null
}
# run_benchmark
#
# Run the specified benchmarks
#
# Arguments: $1 - The benchmark name
# $2 - Which input to use
# $3 - The run directory root
function run_benchmark {
if [ -z "$1" ]; then
echo "${oprefix} Error: run_benchmark called with no arguments." | ${TEE} ${log}
exit 1
fi
local benchmark=$1
if [ -z "$2" ]; then
echo "${oprefix} Error: run_benchmark called with insufficient number of arguments." | ${TEE} ${log}
exit 1
fi
local inputsize=$2
if [ -z "$3" ]; then
if [ ${benchmark} == "parsec.uptcpip" ]; then
exit 1
fi
echo "${oprefix} Error: run_benchmark called with insufficient number of arguments." | ${TEE} ${log}
exit 1
fi
local cite_list=$3
if [ -z "$4" ]; then
echo "${oprefix} Error: run_benchmark called with insufficient number of arguments." | ${TEE} ${log}
exit 1
fi
local rundir=$4
echo "${oprefix} [========== Running benchmark ${benchmark} [${cite_list}] ==========]" | ${TEE} ${log}
# Load package configuration
source ${PARSECDIR}/config/packages/${benchmark}.pkgconf
# Define benchmark-specific directories
if [ -z "${pkg_group}" ]; then
echo "${oprefix} Error: Group of benchmark '${benchmark}' is unknown." | ${TEE} ${log}
exit 1
fi
# determine top directory
local bench
bench=`expr match ${benchmark} '\(.*\.\)'`
eval pkgname="${benchmark#${bench}}"
bench=${bench%\.}
# deal with some specific cases
if [ ${bench} == "parsec" ]; then
eval benchdir="pkgs"
else
eval benchdir="ext/${bench}"
fi
# splash2 does not support multiple inputs
if [ ${bench} == "splash2" ]; then
inputsize="test"
echo "${oprefix} NOTE: SPLASH-2 only supports \"test\" input sets." | ${TEE} ${log}
echo "${oprefix} Please use SPLASH-2x for multiple input sets." | ${TEE} ${log}
fi
# splash2 does not support multiple inputs
if [ ${bench} == "splash2" ]; then
inputsize="test"
echo "${oprefix} NOTE: SPLASH-2 only supports \"test\" input sets." | ${TEE} ${log}
echo "${oprefix} Please use SPLASH-2x for multiple input sets." | ${TEE} ${log}
fi
local platform
platform=${PARSECPLAT/serial/REPLACED} # check if gcc-serial
if [ ${platform} != ${PARSECPLAT} ]; then
if [ "${NTHREADS}" -gt "1" ]; then
NTHREADS=1
echo "${oprefix} WARNING: Serial does not support multiple threads." | ${TEE} ${log}
echo "${oprefix} Change thread number to default 1." | ${TEE} ${log}
fi
fi
# specific cases end
#
local bmrundir="${rundir}/${benchdir}/${pkg_group}/${pkgname}/run"
local bmdir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
local bminputdir="${bmdir}/inputs"
local bmoutputdir="${bmdir}/outputs"
local bminstdir="${bmdir}/inst/${PARSECPLAT}"
local bmparsecdir="${bmdir}/parsec"
# netapps leverages existing benchmark's inputs
if [ ${pkg_group} == "netapps" ]; then
if [ ${pkgname} == "netdedup" ] || [ ${pkgname} == "netstreamcluster" ]; then
bminputdir=${bminputdir/netapps\/net/kernels\/}
elif [ ${pkgname} == "netferret" ]; then
bminputdir=${bminputdir/netapps\/net/apps\/}
fi
fi
# Check whether selected input size is available
if [ ! -f "${PARSECDIR}/config/${inputsize}.runconf" ]; then
echo "${oprefix} Error: Selected input size not available." 2>&1 | ${TEE} ${log}
exit 1
fi
# Source package run configuration
if [ ! -f "${bmparsecdir}/${inputsize}.runconf" ]; then
echo "${oprefix} Error: Cannot find run configuration '${inputsize}.runconf' for package ${benchmark}." 2>&1 | ${TEE} ${log}
exit 1
get_topdir "${package}"
else
source ${bmparsecdir}/${inputsize}.runconf
fi
# Determine binary
local bmexec_suffix=${run_exec}
if [ -z "${bmexec_suffix}" ]; then
echo "${oprefix} Variable 'bench_exec_${benchmark}' for package '${benchmark}' has not been set." | ${TEE} ${log}
exit 1
fi
local bmexec="${bminstdir}/${bmexec_suffix}"
if [ ! -x "${bmexec}" ]; then
echo "${oprefix} Error: Binary '${bmexec}' of package '${benchmark}' cannot be found." | ${TEE} ${log}
exit 1
fi
# Determine output archive
local bmoutput="${bmoutputdir}/output_${inputsize}.tar"
#if [ ! -f "${bmoutput}" ]; then
# echo "${oprefix} Error: Output archive '${bmoutput}' of package '${benchmark}' cannot be found." | ${TEE} ${log}
# exit 1
#fi
if [ "${keep_rundir}" == "yes" ]; then
# Keep run directory, just check that it exists
if [ ! -d "${bmrundir}" ]; then
echo "${oprefix} Error: Cannot keep run directory because it does not exist." | ${TEE} ${log}
exit 1
fi
echo "${oprefix} Keeping old run directory." | ${TEE} ${log}
pushd "${bmrundir}" > /dev/null
else
# Set up run directory
if [ -d "${bmrundir}" ]; then
echo "${oprefix} Deleting old run directory." | ${TEE} ${log}
${RM} ${bmrundir} | ${TEE} ${log}
fi
echo "${oprefix} Setting up run directory." | ${TEE} ${log}
${MKDIR} ${bmrundir} | ${TEE} ${log}
pushd "${bmrundir}" > /dev/null
# Determine input archive
local bminput="${bminputdir}/input_${inputsize}.tar"
if [ ! -f "${bminput}" ]; then
echo "${oprefix} No archive for input '${inputsize}' available, skipping input setup." | ${TEE} ${log}
else
echo "${oprefix} Unpacking benchmark input '${inputsize}'." | ${TEE} ${log}
${UNTAR} ${bminput} | ${TEE} ${log}
fi
fi
# Execute
local bmexec_args=${run_args}
if [ ! -z ${netmode} ]; then
bmexec_args="${bmexec_args} ${netmode}"
fi
if [ ! -z ${userthreads} ]; then
bmexec_args="${bmexec_args} ${userthreads}"
fi
if [ ! -z ${rxthreads} ]; then
UPTCPIP_RX_THREADS="${rxthreads}"
export UPTCPIP_RX_THREADS
else
UPTCPIP_RX_THREADS=1
export UPTCPIP_RX_THREADS
fi
eval cmd="\"${submit} ${bmexec} ${bmexec_args}\""
echo "${oprefix} Running '${cmd}':" | ${TEE} ${log}
echo "${oprefix} [---------- Beginning of output ----------]" | ${TEE} ${log}
(eval ${cmd} 2>&1) 2>&1 | ${TEE} ${bmrundir}/benchmark.out | ${TEE} ${log}
echo "${oprefix} [---------- End of output ----------]" | ${TEE} ${log}
# Unpack reference output and compare
#echo "${oprefix} Unpacking benchmark reference output for '${inputsize}'." | ${TEE} ${log}
#${MKDIR} ${bmrundir}/output.ref | ${TEE} ${log}
#cd ${bmrundir}/output.ref
#${UNTAR} ${bmoutput} | ${TEE} ${log}
#echo "${oprefix} Checking benchmark output:" | ${TEE} ${log}
#bmcorrect="TRUE"
#for outfile in *; do
# echo -n "${oprefix} ${outfile} - " | ${TEE} ${log}
# if [ ! -f "${bmrundir}/${outfile}" ]; then
# echo "MISSING" | ${TEE} ${log}
# bmcorrect="FALSE"
# else
# ${CMP} ${bmrundir}/output.ref/${outfile} ${bmrundir}/${outfile} > /dev/null
# if [ "$?" == "0" ]; then
# echo "PASSED" | ${TEE} ${log}
# else
# echo "FAILED" | ${TEE} ${log}
# bmcorrect="FALSE"
# fi
# fi
#done
#if [ "${bmcorrect}" != "TRUE" ]; then
# echo "${oprefix} Error: Benchmark not correctly executed." | ${TEE} ${log}
# exit 1
#else
# echo "${oprefix} Benchmark correctly executed." | ${TEE} ${log}
#fi
popd > /dev/null
}
function get_topdir {
if [ -z "$1" ]; then
echo "${oprefix} Error: get_topdir with no arguments." | ${TEE} ${log}
exit 1
fi
local benchmark=$1
# determine top directory
benchdir=""
pkgname=""
local bench
bench=`expr match ${benchmark} '\(.*\.\)'`
eval pkgname="${benchmark#${bench}}"
bench=${bench%\.}
if [ ${bench} == "parsec" ]; then
benchdir="pkgs"
else
eval benchdir="ext\/${bench}"
fi
}
#################################################################
# #
# MAIN #
# #
#################################################################
# Check version
if [ ${BASH_VERSINFO[0]} -lt 3 ]; then
# We need certain Bash 3 features. e.g. PIPESTATUS (which was available but broken in earlier versions)
echo "${oprefix} Warning: At least bash version 3 is recommended. Earlier versions might not function properly. Current version is $BASH_VERSION."
fi
# Execute functions to setup environment
parsec_init
process_args "$@"
# Now we take decisive action
case ${action} in
"build" )
eval echo "${oprefix} \[========== PARSEC $(${CAT} ${PARSECDIR}/version) BUILD LOGFILE ==========\]" > ${log}
echo >> ${log}
eval echo "${oprefix} Build '${PARSECPLAT}' started on \$(${DATE})." >> ${log}
echo "${oprefix} Packages to build: ${pkgs}" 2>&1 | ${TEE} ${log}
# Prepare LD_LIBRARY_PATH (some build systems call their own binaries)
LD_LIBRARY_PATH_orig="${LD_LIBRARY_PATH}"
if [ -z "${LD_LIBRARY_PATH}" ]; then
export LD_LIBRARY_PATH="${CC_HOME}/lib:${CC_HOME}/lib64"
else
LD_LIBRARY_PATH="${CC_HOME}/lib:${CC_HOME}/lib64:${LD_LIBRARY_PATH}"
fi
# Initialize local variables
list_of_bibentries=""
# Build all packages
for pkg in ${pkgs}; do
# Load package configuration
source ${PARSECDIR}/config/packages/${pkg}.pkgconf
cite_list=""
for bibkey in ${pkg_cite}; do
i=1
is_duplicate=""
for bib in ${list_of_bibentries}; do
if [[ "${bibkey}" == "${bib}" ]]; then
is_duplicate="TRUE"
break
fi
((i++))
done
if [[ -z "${is_duplicate}" ]]; then
# A unique entry, append to bibliography list
# (Note: Order is important because of the numbering)
list_of_bibentries="${list_of_bibentries} ${bibkey}"
fi
# Always append citation number to list of citations for component
if [[ -z "${cite_list}" ]]; then
cite_list="$i"
else
cite_list="${cite_list},${i}"
fi
done
echo | ${TEE} ${log}
echo "${oprefix} [========== Building package ${pkg} [${cite_list}] ==========]" | ${TEE} ${log}
build_package "${pkg}"
done
# Bibliography list
echo "${oprefix}"
echo "${oprefix} BIBLIOGRAPHY"
echo "${oprefix}"
# Initialize variables & iterate through list of used bib entries
i=1
for bibkey in ${list_of_bibentries}; do
bibfile="${PARSECDIR}/config/bibliography/${bibkey}.bibconf"
if [[ -f ${bibfile} ]]; then
source ${bibfile}
echo "${oprefix} [${i}] ${bib_string}"
else
echo "${oprefix} [${i}] ERROR: File '${bibkey}.bibconf' does not exist."
fi
((i++))
done
echo "${oprefix}"
# Restore LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH_orig}"
echo "${oprefix} Done." | ${TEE} ${log};;
"run" )
eval echo "${oprefix} \[========== PARSEC $(${CAT} ${PARSECDIR}/version) RUN LOGFILE ==========\]" > ${log}
echo >> ${log}
eval echo "${oprefix} Run with '${PARSECPLAT}' binaries and input ${inputsize} started on \$(${DATE})." >> ${log}
# echo "${oprefix} Using ${rundir} as run directory root." >> ${log}
echo "${oprefix} Benchmarks to run: ${pkgs}" 2>&1 | ${TEE} ${log}
# Prepare LD_LIBRARY_PATH
LD_LIBRARY_PATH_orig="${LD_LIBRARY_PATH}"
if [ -z "${LD_LIBRARY_PATH}" ]; then
export LD_LIBRARY_PATH="${CC_HOME}/lib:${CC_HOME}/lib64"
else
LD_LIBRARY_PATH="${CC_HOME}/lib:${CC_HOME}/lib64:${LD_LIBRARY_PATH}"
fi
# Initialize local variables
list_of_bibentries=""
# Execute all benchmarks
for benchmark in ${pkgs}; do
# Load package configuration
source ${PARSECDIR}/config/packages/${benchmark}.pkgconf
cite_list=""
for bibkey in ${pkg_cite}; do
i=1
is_duplicate=""
for bib in ${list_of_bibentries}; do
if [[ "${bibkey}" == "${bib}" ]]; then
is_duplicate="TRUE"
break
fi
((i++))
done
if [[ -z "${is_duplicate}" ]]; then
# A unique entry, append to bibliography list
# (Note: Order is important because of the numbering)
list_of_bibentries="${list_of_bibentries} ${bibkey}"
fi
# Always append citation number to list of citations for component
if [[ -z "${cite_list}" ]]; then
cite_list="$i"
else
cite_list="${cite_list},${i}"
fi
done
echo | ${TEE} ${log}
run_benchmark "${benchmark}" "${inputsize}" "${cite_list}" "${rundir}"
done
# Bibliography list
echo "${oprefix}"
echo "${oprefix} BIBLIOGRAPHY"
echo "${oprefix}"
# Initialize variables & iterate through list of used bib entries
i=1
for bibkey in ${list_of_bibentries}; do
bibfile="${PARSECDIR}/config/bibliography/${bibkey}.bibconf"
if [[ -f ${bibfile} ]]; then
source ${bibfile}
echo "${oprefix} [${i}] ${bib_string}"
else
echo "${oprefix} [${i}] ERROR: File '${bibkey}.bibconf' does not exist."
fi
((i++))
done
echo "${oprefix}"
# Restore LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH_orig}"
echo "${oprefix} Done." | ${TEE} ${log};;
"clean" )
echo "${oprefix} Removing build and run files for build '${PARSECPLAT}':"
for package in ${pkgs}; do
# Load package configuration
source ${PARSECDIR}/config/packages/${package}.pkgconf
get_topdir "${package}"
# Setup
packagedir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
packageobjdir="${packagedir}/obj/${PARSECPLAT}"
packageparsecdir="${packagedir}/parsec"
packagerundir="${rundir}/${benchdir}/${pkg_group}/${pkgname}/run"
cleanenv="sysconfig=\"${sysconfig}\" packagedir=\"${packagedir}\""
nothingtodo=""
echo -n "${oprefix} ${package} - "
# Remove build directory
if [ -d "${packageobjdir}" ]; then
echo -n "[Removing build '${PARSECPLAT}'] "
${RM} ${packageobjdir}
nothingtodo="FALSE"
fi
# Remove run directory
if [ -d "${packagerundir}" ]; then
echo -n "[Removing run directory]"
${RM} ${packagerundir}
nothingtodo="FALSE"
fi
# Finish
if [ -z "${nothingtodo}" ]; then
echo -n "[Nothing to do]"
fi
echo ""
done
exit 0;;
"uninstall" )
echo "${oprefix} Removing installations for build '${PARSECPLAT}':"
for package in ${pkgs}; do
# Load package configuration
source ${PARSECDIR}/config/packages/${package}.pkgconf
get_topdir "${package}"
# Setup
packagedir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
packageinstdir="${packagedir}/inst/${PARSECPLAT}"
packageparsecdir="${packagedir}/parsec"
cleanenv="sysconfig=\"${sysconfig}\" packagedir=\"${packagedir}\""
nothingtodo=""
echo -n "${oprefix} ${package} - "
# Remove inst directory
if [ -d "${packageinstdir}" ]; then
echo -n "[Removing installation '${PARSECPLAT}'] "
${RM} ${packageinstdir}
nothingtodo="FALSE"
fi
# Finish
if [ -z "${nothingtodo}" ]; then
echo -n "[Nothing to do]"
fi
echo ""
done
exit 0;;
"fullclean" )
echo "${oprefix} Removing all build and run files:"
for package in ${pkgs}; do
# Load package configuration
source ${PARSECDIR}/config/packages/${package}.pkgconf
get_topdir "${package}"
# Setup
packagedir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
packageobjdir="${packagedir}/obj"
packageparsecdir="${packagedir}/parsec"
packagerundir="${rundir}/${benchdir}/${pkg_group}/${pkgname}/run"
cleanenv="sysconfig=\"${sysconfig}\" packagedir=\"${packagedir}\""
nothingtodo=""
echo -n "${oprefix} ${package} - "
# Remove obj directory
if [ -d "${packageobjdir}" ]; then
echo -n "[Removing build directory] "
${RM} ${packageobjdir}
nothingtodo="FALSE"
fi
# Remove run directory
if [ -d "${packagerundir}" ]; then
echo -n "[Removing run directory] "
${RM} ${packagerundir}
nothingtodo="FALSE"
fi
# Finish
if [ -z "${nothingtodo}" ]; then
echo -n "[Nothing to do]"
fi
echo ""
done
exit 0;;
"fulluninstall" )
echo "${oprefix} Removing all installed files:"
for package in ${pkgs}; do
# Load package configuration
source ${PARSECDIR}/config/packages/${package}.pkgconf
get_topdir "${package}"
# Setup
packagedir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
packageinstdir="${packagedir}/inst"
packageparsecdir="${packagedir}/parsec"
cleanenv="sysconfig=\"${sysconfig}\" packagedir=\"${packagedir}\""
nothingtodo=""
echo -n "${oprefix} ${package} - "
# Remove inst directory
if [ -d "${packageinstdir}" ]; then
echo -n "[Removing installation directory]"
${RM} ${packageinstdir}
nothingtodo="FALSE"
fi
# Finish
if [ -z "${nothingtodo}" ]; then
echo -n "[Nothing to do]"
fi
echo ""
done
exit 0;;
"status" )
echo "${oprefix} Installation status of selected packages: "
# Initialize local variables
list_of_bibentries=""
for package in ${pkgs}; do
# Load package configuration
source ${PARSECDIR}/config/packages/${package}.pkgconf
echo "${oprefix}"
cite_list=""
for bibkey in ${pkg_cite}; do
i=1
is_duplicate=""
for bib in ${list_of_bibentries}; do
if [[ "${bibkey}" == "${bib}" ]]; then
is_duplicate="TRUE"
break
fi
((i++))
done
if [[ -z "${is_duplicate}" ]]; then
# A unique entry, append to bibliography list
# (Note: Order is important because of the numbering)
list_of_bibentries="${list_of_bibentries} ${bibkey}"
fi
# Always append citation number to list of citations for component
if [[ -z "${cite_list}" ]]; then
cite_list="$i"
else
cite_list="${cite_list},${i}"
fi
done
get_topdir "${package}"
echo "${oprefix} ${package} [${cite_list}]:"
packageinstdir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}/inst"
if [ -d "${packageinstdir}" ]; then
build_arch_dirs="$(${LS} ${packageinstdir})"
if [ -z "${build_arch_dirs}" ]; then
echo -e "${oprefix} -no installations-"
else
found_insts="FALSE"
for archdir in $build_arch_dirs; do
if [ -f "${packageinstdir}/${archdir}/build-info" ]; then
echo -e "${oprefix} ${archdir}"
found_insts="TRUE"
fi
done
if [ "${found_insts}" == "FALSE" ]; then
echo -e "${oprefix} -no installations-"
fi
fi
else
echo -e "${oprefix} -no installations-"
fi
done
# Bibliography list
echo "${oprefix}"
echo "${oprefix} BIBLIOGRAPHY"
echo "${oprefix}"
# Initialize variables & iterate through list of used bib entries
i=1
for bibkey in ${list_of_bibentries}; do
bibfile="${PARSECDIR}/config/bibliography/${bibkey}.bibconf"
if [[ -f ${bibfile} ]]; then
source ${bibfile}
echo "${oprefix} [${i}] ${bib_string}"
else
echo "${oprefix} [${i}] ERROR: File '${bibkey}.bibconf' does not exist."
fi
((i++))
done
exit 0;;
"info" )
# Initialize local variables
list_of_bibentries=""
parsecversion="$(${CAT} ${PARSECDIR}/version)"
# Output header
echo "${oprefix} PARSEC Distribution v${parsecversion}"
echo "${oprefix}"
# List all available packages
echo "${oprefix} PACKAGES"
echo "${oprefix}"
for file in ${PARSECDIR}/config/packages/*.pkgconf; do
# Get package name
eval package=$(${BASENAME} $file)
package=${package%\.pkgconf}
# Load package configuration
source ${PARSECDIR}/config/packages/${package}.pkgconf
# Update bibliography list & get citation reference numbers
cite_list=""
for bibkey in ${pkg_cite}; do
i=1
is_duplicate=""
for bib in ${list_of_bibentries}; do
if [[ "${bibkey}" == "${bib}" ]]; then
is_duplicate="TRUE"
break
fi
((i++))
done
if [[ -z "${is_duplicate}" ]]; then
# A unique entry, append to bibliography list
# (Note: Order is important because of the numbering)
list_of_bibentries="${list_of_bibentries} ${bibkey}"
fi
# Always append citation number to list of citations for component
if [[ -z "${cite_list}" ]]; then
cite_list="$i"
else
cite_list="${cite_list},${i}"
fi
done
# Create output
echo "${oprefix} ${package} [${cite_list}] (${pkg_domain})"
echo "${oprefix} ${pkg_desc}"
echo "${oprefix} Package Group: ${pkg_group}"
echo "${oprefix} Contributor: ${pkg_contrib}"
echo "${oprefix} Aliases: ${pkg_aliases}"
echo "${oprefix}"
done
# List all available input sets
echo "${oprefix} INPUT SETS"
echo "${oprefix}"
for inputfile in ${PARSECDIR}/config/*.runconf; do
# Get input name
inputname=$(${BASENAME} ${inputfile})
inputname=${inputname/%.runconf/}
# Load configuration file
source ${inputfile}
# Update bibliography list & get citation reference numbers
cite_list=""
for bibkey in ${pkg_cite}; do
i=1
is_duplicate=""
for bib in ${list_of_bibentries}; do
if [[ "${bibkey}" == "${bib}" ]]; then
is_duplicate="TRUE"
break
fi
((i++))
done
if [[ -z "${is_duplicate}" ]]; then
# A unique entry, append to bibliography list
# (Note: Order is important because of the numbering)
list_of_bibentries="${list_of_bibentries} ${bibkey}"
fi
# Always append citation number to list of citations for component
if [[ -z "${cite_list}" ]]; then
cite_list="$i"
else
cite_list="${cite_list},${i}"
fi
done
# Output information
echo "${oprefix} ${inputname} [${cite_list}]"
echo "${oprefix} ${run_desc}"
echo "${oprefix}"
done
# List all supported build configurations
echo "${oprefix} BUILD CONFIGURATIONS"
echo "${oprefix}"
build_config_files=$(ls ${PARSECDIR}/config/*.bldconf)
for file in ${build_config_files}; do
config_file_base=$(${BASENAME} ${file})
echo "${oprefix} ${config_file_base%.bldconf}"
done
# Bibliography list
echo "${oprefix}"
echo "${oprefix} BIBLIOGRAPHY"
echo "${oprefix}"
# Initialize variables & iterate through list of used bib entries
i=1
for bibkey in ${list_of_bibentries}; do
bibfile="${PARSECDIR}/config/bibliography/${bibkey}.bibconf"
if [[ -f ${bibfile} ]]; then
source ${bibfile}
echo "${oprefix} [${i}] ${bib_string}"
else
echo "${oprefix} [${i}] ERROR: File '${bibkey}.bibconf' does not exist."
fi
((i++))
done
exit 0;;
* )
echo "${oprefix} Error: Unknown action '${action}'."
exit 1;;
esac
exit 0