-#!/bin/bash
+#! /bin/sh
+
+# Copyright (c) 2007-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
@CMAKE_SMPI_COMMAND@
NETWORK_LATENCY="${DEFAULT_NETWORK_LATENCY}"
POWER="${DEFAULT_POWER}"
-SIMOPTS="--cfg=maxmin/precision:1e-9 --cfg=network/model:SMPI --cfg=network/TCP_gamma:4194304"
+SIMOPTS="--cfg=maxmin/precision:1e-3 --cfg=surf/precision:1e-9 --cfg=network/model:SMPI --cfg=network/TCP_gamma:4194304"
#usage to print the way this script should be called
-function usage () {
+usage () {
cat <<EOF
Usage: $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> program [program-options]
Options:
-keep-temps # don't remove the generated files after execution
+ -wrapper <command> # use command to run the program (e.g. "valgrind")
-map # display the machine on which each process rank is mapped
-np <numprocs> # use that amount of processes from the hostfile.
# By default, all processes of the hostfile are used.
- -trace # activate tracing
+ -trace-ti # activate time independant tracing (for replay, default in smpi_simgrid.txt)
+ -trace # activate tracing (Paje, default in smpi_simgrid.trace)
-trace-comment <comment> # put a comment on the top of the trace file
-trace-comment-file <file> # put file contents on the top of the trace file as comment
-trace-grouped # group MPI processes by location
-trace-resource # trace resource utilization
- -trace-viva # generate configuration for Viva's GraphView
+ -trace-viva # generate configuration for Viva's GraphView
-trace-file <tracefile> # name of the tracefile (simgrid_smpi.trace)
-ext <value> # additional parameter (reserved)
fi
EXTOPT=""
+WRAPPER=""
+HOSTFILE=""
while true; do
case "$1" in
shift 2
;;
+ "-machinefile")
+ HOSTFILE="$2"
+ if [ ! -f "${HOSTFILE}" ]; then
+ echo "[$0] ** error: the file '${HOSTFILE}' does not exist. Aborting."
+ exit 1
+ fi
+ shift 2
+ ;;
+
"-ext")
EXTOPT="$2"
shift 2
shift 1
;;
+ "-trace-ti")
+ TRACE_ACTIVE="true"
+ TRACE_TI_ACTIVE="true"
+ shift 1
+ ;;
+
"-trace-comment")
TRACE_COMMENT="$2"
shift 2
shift 1
;;
+ "-wrapper")
+ WRAPPER="$2"
+ shift 2
+ ;;
+
"-help" | "--help" | "-h")
usage
exit
esac
done
-EXEC="$1"
+if [ -n "$WRAPPER" ]; then
+ EXEC="$WRAPPER $1"
+else
+ EXEC="$1"
+fi
shift
+# steel --cfg and --logs options
+while [ $# -gt 0 ]; do
+ case "$1" in
+ "--cfg="*|"--log="*)
+ for OPT in ${1#*=}
+ do
+ SIMOPTS="$SIMOPTS ${1%%=*}=$OPT"
+ done
+ shift 1
+ ;;
+ *)
+ PROC_ARGS="${PROC_ARGS:+$PROC_ARGS }$1"
+ shift
+ ;;
+ esac
+done
+
+
##-----------------------------------
-# Basic checks on the provided arguments
-if [ -z "${EXEC}" ] ; then
- echo "You must provide a program to execute."
+
+if [ -z "${HOSTFILE}" ] && [ -z "${PLATFORM}" ] ; then
+ echo "No hostfile nor platform specified."
usage
exit 1
fi
+HOSTFILETMP=0
if [ -z "${HOSTFILE}" ] ; then
- echo "No hostfile specified."
- usage
- exit 1
+ HOSTFILETMP=1
+ HOSTFILE="$(mktemp tmphostXXXXXX)"
+ perl -ne 'print "$1\n" if /.*<host.*?id="(.*?)".*?\/>.*/' ${PLATFORM} > ${HOSTFILE}
+fi
+UNROLLEDHOSTFILETMP=0
+
+#parse if our lines are terminated by :num_process
+multiple_processes=`grep -c ":" $HOSTFILE`
+if [ "${multiple_processes}" -gt 0 ] ; then
+ UNROLLEDHOSTFILETMP=1
+ UNROLLEDHOSTFILE="$(mktemp tmphostXXXXXX)"
+ perl -ne ' do{ for ( 1 .. $2 ) { print "$1\n" } } if /(.*?):(\d+).*/' ${HOSTFILE} > ${UNROLLEDHOSTFILE}
+ if [ ${HOSTFILETMP} = 1 ] ; then
+ rm ${HOSTFILE}
+ HOSTFILETMP=0
+ fi
+ HOSTFILE=$UNROLLEDHOSTFILE
fi
+
# Don't use wc -l to compute it to avoid issues with trailing \n at EOF
hostfile_procs=`grep -c "[a-zA-Z0-9]" $HOSTFILE`
<AS id="AS0" routing="Full">
PLATFORMHEAD
-for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
+i=${NUMPROCS}
+while [ $i -gt 0 ]; do
echo " <host id=\"host$i\" power=\"${POWER}\"/>" >> ${PLATFORMTMP}
echo " <link id=\"loop$i\" bandwidth=\"${LOOPBACK_BANDWIDTH}\" latency=\"${LOOPBACK_LATENCY}\"/>" >> ${PLATFORMTMP}
echo " <link id=\"link$i\" bandwidth=\"${NETWORK_BANDWIDTH}\" latency=\"${NETWORK_LATENCY}\"/>" >> ${PLATFORMTMP}
+ i=$((i - 1))
done
-for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
- for (( j=${NUMPROCS}; $j ; j=$j-1 )) do
+i=${NUMPROCS}
+while [ $i -gt 0 ]; do
+ j=${NUMPROCS}
+ while [ $j -gt 0 ]; do
if [ $i -eq $j ]; then
echo " <route src=\"host$i\" dst=\"host$j\"><link_ctn id=\"loop$i\"/></route>" >> ${PLATFORMTMP}
else
echo " <route src=\"host$i\" dst=\"host$j\"><link_ctn id=\"link$i\"/><link_ctn id=\"link$j\"/></route>" >> ${PLATFORMTMP}
fi
+ j=$((j - 1))
done
+ i=$((i - 1))
done
cat >> ${PLATFORMTMP} <<PLATFORMFOOT
##---- cache hostnames of hostfile---------------
if [ -n "${HOSTFILE}" ] && [ -f ${HOSTFILE} ]; then
- hostnames=(`cat ${HOSTFILE} | tr \\\n " "`)
- NUMHOSTS=`cat ${HOSTFILE} | wc -l`
+ hostnames=$(cat ${HOSTFILE} | tr '\n\r' ' ')
+ NUMHOSTS=$(cat ${HOSTFILE} | wc -l)
fi
if [ "${EXTOPT}" = "smpi_replay" ]; then
- APP_TRACES=$1;
+ APP_TRACES=$PROC_ARGS
if [ -n "${APP_TRACES}" ] && [ -f "${APP_TRACES}" ]; then
- hosttraces=(`cat ${APP_TRACES} | tr \\\n " "`)
- NUMTRACES=`cat ${APP_TRACES} | wc -l`
+ hosttraces=$(cat ${APP_TRACES} | tr '\n\r' ' ' )
+ NUMTRACES=$(cat ${APP_TRACES} | wc -l)
else
- printf "File not found: %s\n", "${APP_TRACES:-\${APP_TRACES}}" >&2
+ printf "File not found: %s\n", "${APP_TRACES:-\${APP_TRACES\}}" >&2
exit 1
fi
fi
for i in ${SEQ}
do
if [ -n "${HOSTFILE}" ]; then
- j=$(( $i % ${NUMHOSTS} ))
+ j=$(( $i % ${NUMHOSTS} + 1 ))
fi
##---- optional display of ranks to process mapping
if [ -n "${MAPOPT}" ]; then
- echo "[rank $i] -> ${hostnames[$j]}"
+ echo "[rank $i] -> $(echo $hostnames|cut -d' ' -f$j)"
fi
- if [ -z "${hostnames[$j]}" ]; then
- host="host"$(($j+1))
+ if [ -z "$(echo $hostnames|cut -d' ' -f$j)" ]; then
+ host="host"$($j)
else
- host="${hostnames[$j]}"
+ host="$(echo $hostnames|cut -d' ' -f$j)"
fi
echo " <process host=\"${host}\" function=\"$i\"> <!-- function name used only for logging -->" >> ${APPLICATIONTMP}
+ echo " <argument value=\"1\"/> <!-- instance -->" >> ${APPLICATIONTMP}
echo " <argument value=\"$i\"/> <!-- rank -->" >> ${APPLICATIONTMP}
if [ "${EXTOPT}" = "smpi_replay" ]; then
if [ ${NUMTRACES} -gt 1 ]; then
- echo " <argument value=\"${hosttraces[$j]}\"/>" >> ${APPLICATIONTMP}
+ echo " <argument value=\"$(echo $hosttraces|cut -d' ' -f$j)\"/>" >> ${APPLICATIONTMP}
else
- echo " <argument value=\"${hosttraces[0]}\"/>" >> ${APPLICATIONTMP}
+ echo " <argument value=\"$(echo $hosttraces|cut -d' ' -f1)\"/>" >> ${APPLICATIONTMP}
fi
else
- for ARG in $*; do
+ for ARG in $PROC_ARGS; do
echo " <argument value=\"${ARG}\"/>" >> ${APPLICATIONTMP}
done
fi
##---------------------- SMPI TRACING OPTIONS ---------------------------------
if [ -n "${TRACE_ACTIVE}" ]; then
#define trace filename
- if [ -z "${TRACE_FILENAME}" ]; then
- TRACE_FILENAME="smpi_simgrid.trace"
+ if [ -n "${TRACE_TI_ACTIVE}" ]; then
+ if [ -z "${TRACE_FILENAME}" ]; then
+ TRACE_FILENAME="smpi_simgrid.txt"
+ fi
+ TRACEOPTIONS="--cfg=tracing:yes --cfg=tracing/filename:${TRACE_FILENAME} --cfg=tracing/smpi:yes --cfg=tracing/smpi/format:TI --cfg=tracing/smpi/computing:yes"
+ else
+ if [ -z "${TRACE_FILENAME}" ]; then
+ TRACE_FILENAME="smpi_simgrid.trace"
+ fi
+ TRACEOPTIONS="--cfg=tracing:yes --cfg=tracing/filename:${TRACE_FILENAME} --cfg=tracing/smpi:yes"
fi
- TRACEOPTIONS="--cfg=tracing:1 --cfg=tracing/filename:${TRACE_FILENAME} --cfg=tracing/smpi:1"
if [ -n "${TRACE_COMMENT}" ]; then
TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/comment:${TRACE_COMMENT}"
fi
if [ -n "${TRACE_GROUPED}" ]; then
- TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/smpi/group:1"
+ TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/smpi/group:yes"
fi
if [ -n "${TRACE_RESOURCE}" ]; then
- TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1"
+ TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes"
fi
if [ -n "${TRACE_VIVA}" ]; then
export SMPI_GLOBAL_SIZE=${NUMPROCS}
if [ -n "${KEEP}" ] ; then
echo ${EXEC} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP}
+ if [ ${HOSTFILETMP} = 1 ] ; then
+ echo "Generated hostfile ${HOSTFILE} keeped."
+ fi
+ if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
+ echo "Generated unrolled hostfile ${UNROLLEDHOSTFILE} keeped."
+ fi
fi
${EXEC} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP}
status=$?
if [ -z "${PLATFORM}" ]; then
rm ${PLATFORMTMP}
fi
+ if [ ${HOSTFILETMP} = 1 ] ; then
+ rm ${HOSTFILE}
+ fi
+ if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
+ rm ${UNROLLEDHOSTFILE}
+ fi
rm ${APPLICATIONTMP}
fi