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.
9 #usage to print the way this script should be called
12 Usage: $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> replay-file output-file
16 #check if we have at least one parameter
31 if [ ! -f "${PLATFORM}" ]; then
32 echo "[`basename $0`] ** error: the file '${PLATFORM}' does not exist. Aborting."
39 if [ ! -f "${HOSTFILE}" ]; then
40 echo "[`basename $0`] ** error: the file '${HOSTFILE}' does not exist. Aborting."
47 if [ ! -f "${HOSTFILE}" ]; then
48 echo "[`basename $0`] ** error: the file '${HOSTFILE}' does not exist. Aborting."
59 # steel --cfg and --logs options
60 while [ $# -gt 0 ]; do
65 SIMOPTS="$SIMOPTS ${1%%=*}=$OPT"
70 PROC_ARGS="${PROC_ARGS:+$PROC_ARGS }$1"
76 if [ -z "${HOSTFILE}" ] && [ -z "${PLATFORM}" ] ; then
77 echo "No hostfile nor platform specified."
83 if [ -z "${HOSTFILE}" ] ; then
85 HOSTFILE="$(mktemp tmphostXXXXXX)"
86 perl -ne 'print "$1\n" if /.*<host.*?id="(.*?)".*?\/>.*/' ${PLATFORM} > ${HOSTFILE}
90 #parse if our lines are terminated by :num_process
91 multiple_processes=`grep -c ":" $HOSTFILE`
92 if [ "${multiple_processes}" -gt 0 ] ; then
94 UNROLLEDHOSTFILE="$(mktemp tmphostXXXXXX)"
95 perl -ne ' do{ for ( 1 .. $2 ) { print "$1\n" } } if /(.*?):(\d+).*/' ${HOSTFILE} > ${UNROLLEDHOSTFILE}
96 if [ ${HOSTFILETMP} = 1 ] ; then
100 HOSTFILE=$UNROLLEDHOSTFILE
103 # Don't use wc -l to compute it to avoid issues with trailing \n at EOF
104 hostfile_procs=`grep -c "[a-zA-Z0-9]" $HOSTFILE`
105 if [ ${hostfile_procs} = 0 ] ; then
106 echo "[`basename $0`] ** error: the hostfile '${HOSTFILE}' is empty. Aborting." >&2
110 ##-------------------------------- DEFAULT APPLICATION --------------------------------------
112 APPLICATIONTMP=$(echo ${PROC_ARGS}|cut -d' ' -f2 -s)
114 cat > ${APPLICATIONTMP} <<APPLICATIONHEAD
115 <?xml version='1.0'?>
116 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
117 <platform version="4">
120 ##---- cache hostnames of hostfile---------------
121 if [ -n "${HOSTFILE}" ] && [ -f ${HOSTFILE} ]; then
122 hostnames=$(cat ${HOSTFILE} | tr '\n\r' ' ')
123 NUMHOSTS=$(cat ${HOSTFILE} | wc -l)
126 DESCRIPTIONFILE=$(echo $PROC_ARGS|cut -d' ' -f1)
128 if [ -n "${DESCRIPTIONFILE}" ] && [ -f "${DESCRIPTIONFILE}" ]; then
129 NUMINSTANCES=$(cat ${DESCRIPTIONFILE} | wc -l)
130 replayinstances=$(cat ${DESCRIPTIONFILE})
135 while IFS= read -r line; do
136 # return IFS back if you need to split new line by spaces:
139 # generate three lists, one with instance id, ont with instance size, one with files
140 instance=$(echo "$line"|cut -d' ' -f1)
141 hosttrace=$(cat $(echo "$line"|cut -d' ' -f2)| tr '\n\r' ' ' )
142 NUMPROCSMINE=$(cat $(echo "$line"|cut -d' ' -f2) | wc -l)
144 if [ $NUMPROCSMINE != $(echo "$line"|cut -d' ' -f3) ];
146 echo "declared num of processes for instance $instance : $(echo "$line"|cut -d' ' -f3) is not the same as the one in the replay files : $NUMPROCSMINE. Please check consistency of these information"
150 sleeptime=$(echo "$line"|cut -d' ' -f4)
151 HAVE_SEQ="`which seq 2>/dev/null`"
153 if [ -n "${HAVE_SEQ}" ]; then
154 SEQ1=`${HAVE_SEQ} 0 $((${NUMPROCSMINE}-1))`
157 while (( $cnt < ${NUMPROCSMINE} )) ; do
162 #NUMPROCS=$((${NUMPROCS}+${NUMPROCSMINE}));
164 ##----------------------------------------------------------
165 ## generate application.xml with hostnames from hostfile:
166 ## the name of host_i (1<=i<=p, where -np p) is the line i
167 ## in hostfile (where -hostfile hostfile), or "host$i" if
168 ## hostfile has less than i lines.
169 ##----------------------------------------------------------
171 ##---- generate <process> tags------------------------------
173 if [ -n "${HOSTFILE}" ]; then
174 j=$(( ${NUMPROCS} % ${NUMHOSTS} +1))
176 hostname=$(echo $hostnames|cut -d' ' -f$j)
177 if [ -z "${hostname}" ]; then
183 echo " <process host=\"${host}\" function=\"${instance}\"> <!-- function name used only for logging -->" >> ${APPLICATIONTMP}
184 echo " <argument value=\"${instance}\"/> <!-- instance -->" >> ${APPLICATIONTMP}
185 echo " <argument value=\"${i}\"/> <!-- rank -->" >> ${APPLICATIONTMP}
186 echo " <argument value=\"$(echo $hosttrace|cut -d' ' -f$(($i+1)))\"/>" >> ${APPLICATIONTMP}
188 echo " <argument value=\"${sleeptime}\"/> <!-- delay -->" >> ${APPLICATIONTMP}
189 echo " </process>" >> ${APPLICATIONTMP}
190 NUMPROCS=$(( ${NUMPROCS} +1))
192 # return IFS back to newline for "for" loop
195 done < ${DESCRIPTIONFILE}
197 # return delimiter to previous value
201 printf "File not found: %s\n", ${DESCRIPTIONFILE} >&2
205 cat >> ${APPLICATIONTMP} <<APPLICATIONFOOT
208 ##-------------------------------- end DEFAULT APPLICATION --------------------------------------
210 if [ ${HOSTFILETMP} = 1 ] ; then
213 if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
214 rm ${UNROLLEDHOSTFILE}