3 # Copyright (c) 2007-2014. The SimGrid Team.
6 # This program is free software; you can redistribute it and/or modify it
7 # under the terms of the license (GNU LGPL) which comes with this package.
10 #usage to print the way this script should be called
13 Usage: $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> replay-file output-file
17 #check if we have at least one parameter
32 if [ ! -f "${PLATFORM}" ]; then
33 echo "[`basename $0`] ** error: the file '${PLATFORM}' does not exist. Aborting."
40 if [ ! -f "${HOSTFILE}" ]; then
41 echo "[`basename $0`] ** error: the file '${HOSTFILE}' does not exist. Aborting."
48 if [ ! -f "${HOSTFILE}" ]; then
49 echo "[`basename $0`] ** error: the file '${HOSTFILE}' does not exist. Aborting."
60 # steel --cfg and --logs options
61 while [ $# -gt 0 ]; do
66 SIMOPTS="$SIMOPTS ${1%%=*}=$OPT"
71 PROC_ARGS="${PROC_ARGS:+$PROC_ARGS }$1"
78 ##-----------------------------------
81 if [ -z "${HOSTFILE}" ] && [ -z "${PLATFORM}" ] ; then
82 echo "No hostfile nor platform specified."
88 if [ -z "${HOSTFILE}" ] ; then
90 HOSTFILE="$(mktemp tmphostXXXXXX)"
91 perl -ne 'print "$1\n" if /.*<host.*?id="(.*?)".*?\/>.*/' ${PLATFORM} > ${HOSTFILE}
95 #parse if our lines are terminated by :num_process
96 multiple_processes=`grep -c ":" $HOSTFILE`
97 if [ "${multiple_processes}" -gt 0 ] ; then
99 UNROLLEDHOSTFILE="$(mktemp tmphostXXXXXX)"
100 perl -ne ' do{ for ( 1 .. $2 ) { print "$1\n" } } if /(.*?):(\d+).*/' ${HOSTFILE} > ${UNROLLEDHOSTFILE}
101 if [ ${HOSTFILETMP} = 1 ] ; then
105 HOSTFILE=$UNROLLEDHOSTFILE
109 # Don't use wc -l to compute it to avoid issues with trailing \n at EOF
110 hostfile_procs=`grep -c "[a-zA-Z0-9]" $HOSTFILE`
111 if [ ${hostfile_procs} = 0 ] ; then
112 echo "[`basename $0`] ** error: the hostfile '${HOSTFILE}' is empty. Aborting." >&2
116 APP_TRACES=($PROC_ARGS)
117 ##-------------------------------- DEFAULT APPLICATION --------------------------------------
119 APPLICATIONTMP=${APP_TRACES[1]}
121 cat > ${APPLICATIONTMP} <<APPLICATIONHEAD
122 <?xml version='1.0'?>
123 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
124 <platform version="3">
127 ##---- cache hostnames of hostfile---------------
128 if [ -n "${HOSTFILE}" ] && [ -f ${HOSTFILE} ]; then
129 hostnames=$(cat ${HOSTFILE} | tr '\n\r' ' ')
130 NUMHOSTS=$(cat ${HOSTFILE} | wc -l)
134 if [ -n "${APP_TRACES[0]}" ] && [ -f "${APP_TRACES[0]}" ]; then
135 NUMINSTANCES=$(cat ${APP_TRACES[0]} | wc -l)
136 replayinstances=$(cat ${APP_TRACES[0]})
140 for line in $replayinstances; do
141 # return IFS back if you need to split new line by spaces:
145 # generate three lists, one with instance id, ont with instance size, one with files
147 hosttraces="$hosttraces$(cat ${array[1]}| tr '\n\r' ' ' )"
148 NUMPROCSMINE=$(cat ${array[1]} | wc -l)
150 if [ $NUMPROCSMINE != ${array[2]} ];
152 echo "declared num of processes for instance $instance : ${array[2]} is not the same as the one in the replay files : $NUMPROCSMINE. Please check consistency of these information"
156 sleeptime=${array[3]}
157 HAVE_SEQ="`which seq 2>/dev/null`"
159 if [ -n "${HAVE_SEQ}" ]; then
160 SEQ1=`${HAVE_SEQ} 0 $((${NUMPROCSMINE}-1))`
163 while (( $cnt < ${NUMPROCSMINE} )) ; do
168 NUMPROCS=$((${NUMPROCS}+${NUMPROCSMINE}));
171 instances="$instances$instance "
173 sleeptimes="$sleeptimes$sleeptime "
175 # return IFS back to newline for "for" loop
180 # return delimiter to previous value
184 printf "File not found: %s\n", "${APP_TRACES[0]:-\${APP_TRACES[0]\}}" >&2
189 ##----------------------------------------------------------
190 ## generate application.xml with hostnames from hostfile:
191 ## the name of host_i (1<=i<=p, where -np p) is the line i
192 ## in hostfile (where -hostfile hostfile), or "host$i" if
193 ## hostfile has less than i lines.
194 ##----------------------------------------------------------
196 HAVE_SEQ="`which seq 2>/dev/null`"
198 if [ -n "${HAVE_SEQ}" ]; then
199 SEQ=`${HAVE_SEQ} 0 $((${NUMPROCS}-1))`
202 while (( $cnt < ${NUMPROCS} )) ; do
208 ##---- generate <process> tags------------------------------
210 hostnames=($hostnames)
211 instances=($instances)
212 hosttraces=($hosttraces)
213 sleeptimes=($sleeptimes)
217 if [ -n "${HOSTFILE}" ]; then
218 j=$(( $i % ${NUMHOSTS} ))
220 ##---- optional display of ranks to process mapping
221 if [ -n "${MAPOPT}" ]; then
222 echo "[rank $i] -> ${hostnames[j]}"
225 if [ -z "${hostnames[j]}" ]; then
228 host="${hostnames[j]}"
230 echo " <process host=\"${host}\" function=\"${instances[i]}\"> <!-- function name used only for logging -->" >> ${APPLICATIONTMP}
231 echo " <argument value=\"${instances[i]}\"/> <!-- instance -->" >> ${APPLICATIONTMP}
232 echo " <argument value=\"${ranks[i]}\"/> <!-- rank -->" >> ${APPLICATIONTMP}
233 if [ ${NUMPROCS} -gt 1 ]; then
234 echo " <argument value=\"${hosttraces[i]}\"/>" >> ${APPLICATIONTMP}
236 echo " <argument value=\"${hosttraces[i]}\"/>" >> ${APPLICATIONTMP}
238 echo " <argument value=\"${sleeptimes[i]}\"/> <!-- delay -->" >> ${APPLICATIONTMP}
239 echo " </process>" >> ${APPLICATIONTMP}
242 cat >> ${APPLICATIONTMP} <<APPLICATIONFOOT
245 ##-------------------------------- end DEFAULT APPLICATION --------------------------------------
248 if [ ${HOSTFILETMP} = 1 ] ; then
251 if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
252 rm ${UNROLLEDHOSTFILE}