Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
9145e70b52985d7830f3b961d4ae0443ff223e9c
[simgrid.git] / src / smpi / smpirun.in
1 #!/bin/bash
2
3 @CMAKE_SMPI_COMMAND@
4
5 DEFAULT_LOOPBACK_BANDWIDTH="498000000"
6 DEFAULT_LOOPBACK_LATENCY="0.000004"
7 DEFAULT_NETWORK_BANDWIDTH="$((26 * 1024 * 1024))"
8 DEFAULT_NETWORK_LATENCY="0.000005"
9 DEFAULT_NUMPROCS="4"
10 DEFAULT_POWER="100"
11
12 LOOPBACK_BANDWIDTH="${DEFAULT_LOOPBACK_BANDWIDTH}"
13 LOOPBACK_LATENCY="${DEFAULT_LOOPBACK_LATENCY}"
14 NETWORK_BANDWIDTH="${DEFAULT_NETWORK_BANDWIDTH}"
15 NETWORK_LATENCY="${DEFAULT_NETWORK_LATENCY}"
16 POWER="${DEFAULT_POWER}"
17
18 SIMOPTS="--cfg=maxmin/precision:1e-9 --cfg=network/model:SMPI --cfg=network/TCP_gamma:4194304"
19
20 #usage to print the way this script should be called
21 function usage () {
22 cat <<EOF
23 Usage: $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> program [program-options]
24 Options:
25   -keep-temps                # don't remove the generated files after execution
26   -map                       # display the machine on which each process rank is mapped
27   -np <numprocs>             # use that amount of processes from the hostfile.
28                              # By default, all processes of the hostfile are used.
29   -trace                     # activate tracing
30   -trace-comment <comment>   # put a comment on the top of the trace file
31   -trace-comment-file <file> # put file contents on the top of the trace file as comment
32   -trace-grouped             # group MPI processes by location
33   -trace-resource            # trace resource utilization
34   -trace-triva               # generate configuration for Triva's GraphView
35   -trace-file <tracefile>    # name of the tracefile (simgrid_smpi.trace)
36
37 or (deprecated usage):
38   $0 [-keep-temps] [-np <numprocs>] [-bandwidth <bytes/sec>] [-latency <secs>] program [program-options]
39
40 EOF
41 }
42
43 #check if we have at least one parameter
44 if [ $# -eq 0 ]
45 then
46     usage
47     exit
48 fi
49
50 while true; do
51   case "$1" in
52    "-np" | "-n")
53       NUMPROCS="$2"
54       shift 2
55     ;;
56    "-bandwidth")
57       NETWORK_BANDWIDTH="$2"
58       shift 2
59     ;;
60    "-latency")
61       NETWORK_LATENCY="$2"
62       shift 2
63     ;;
64    "-platform")
65         PLATFORM="$2"
66       if [ ! -f "${PLATFORM}" ]; then
67                 echo "[$0] ** error: the file '${PLATFORM}' does not exist. Aborting."
68                 exit 1
69       fi
70         shift 2
71     ;;
72    "-hostfile")
73         HOSTFILE="$2"
74       if [ ! -f "${HOSTFILE}" ]; then
75                 echo "[$0] ** error: the file '${HOSTFILE}' does not exist. Aborting."
76                 exit 1
77       fi
78         shift 2
79     ;;
80
81    "-map")
82         MAPOPT="true"
83       shift 1
84    ;;
85
86    "-trace")
87       TRACE_ACTIVE="true"
88       shift 1
89    ;;
90
91    "-trace-comment")
92       TRACE_COMMENT="$2"
93       shift 2
94    ;;
95
96    "-trace-comment-file")
97       TRACE_COMMENT_FILE="$2"
98       shift 2
99    ;;
100
101    "-trace-file")
102       TRACE_FILENAME="$2"
103       shift 2
104    ;;
105
106    "-trace-grouped")
107       TRACE_GROUPED="true"
108       shift 1
109    ;;
110
111    "-trace-resource")
112       TRACE_RESOURCE="true"
113       shift 1
114    ;;
115
116    "-trace-triva")
117         TRACE_TRIVA="true"
118           shift 1
119    ;;
120
121    "-keep-temps")
122         KEEP="true"
123       shift 1
124    ;;
125
126    "-help" | "--help" | "-h")
127       usage
128       exit
129    ;;
130
131    "--cfg="*|"--log="*)
132      for OPT in ${1#*=}
133      do
134        SIMOPTS="$SIMOPTS ${1%%=*}=$OPT"
135      done
136      shift 1
137    ;;
138     *)
139       break
140     ;;
141   esac
142 done
143
144 EXEC="$1"
145 shift
146
147 ##-----------------------------------
148
149 # Basic checks on the provided arguments
150 if [ -z "${EXEC}" ] ; then
151     echo "You must provide a program to execute."
152     usage
153     exit 1
154 fi
155
156 if [ -z "${HOSTFILE}" ] ; then
157     echo "No hostfile specified."
158     usage
159     exit 1
160 fi
161
162 # Don't use wc -l to compute it to avoid issues with trailing \n at EOF
163 hostfile_procs=`grep -c [a-zA-Z0-9] $HOSTFILE`
164
165 if [ -z "${NUMPROCS}" ] ; then
166     # Use the amount of processes in the hostfile as default value for the -np parameter
167     NUMPROCS=$hostfile_procs
168 fi
169
170
171 if [ ${NUMPROCS} -gt ${hostfile_procs} ] ; then
172     echo "You requested to use ${NUMPROCS} processes, but there is only ${hostfile_procs} processes in your hostfile..." >&2
173 fi
174
175 ##-------------------------------- DEFAULT or SPECIFIED PLATFORM --------------------------------------
176 if [ -z "${PLATFORM}" ]; then
177         PLATFORMTMP="$(mktemp tmpXXXXXX)"
178
179         cat > ${PLATFORMTMP} <<PLATFORMHEAD
180 <?xml version='1.0'?>
181 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
182 <platform version="3">
183 <AS id="AS0" routing="Full">
184 PLATFORMHEAD
185
186 for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
187   echo "  <host id=\"host$i\" power=\"${POWER}\"/>" >> ${PLATFORMTMP}
188   echo "  <link id=\"loop$i\" bandwidth=\"${LOOPBACK_BANDWIDTH}\" latency=\"${LOOPBACK_LATENCY}\"/>" >> ${PLATFORMTMP}
189   echo "  <link id=\"link$i\" bandwidth=\"${NETWORK_BANDWIDTH}\" latency=\"${NETWORK_LATENCY}\"/>" >> ${PLATFORMTMP}
190 done
191
192 for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
193   for (( j=${NUMPROCS}; $j ; j=$j-1 )) do
194     if [ $i -eq $j ]; then
195       echo "  <route src=\"host$i\" dst=\"host$j\"><link_ctn id=\"loop$i\"/></route>" >> ${PLATFORMTMP}
196     else
197       echo "  <route src=\"host$i\" dst=\"host$j\"><link_ctn id=\"link$i\"/><link_ctn id=\"link$j\"/></route>" >> ${PLATFORMTMP}
198     fi
199   done
200 done
201
202 cat >> ${PLATFORMTMP} <<PLATFORMFOOT
203 </AS>
204 </platform>
205 PLATFORMFOOT
206
207 else
208         PLATFORMTMP=${PLATFORM}
209 fi
210 ##-------------------------------- end DEFAULT or SPECIFIED PLATFORM --------------------------------------
211
212 ##-------------------------------- DEFAULT APPLICATION --------------------------------------
213 APPLICATIONTMP="$(mktemp tmpXXXXXX)"
214 #APPLICATIONTMP="app.xml"
215
216
217 cat > ${APPLICATIONTMP} <<APPLICATIONHEAD
218 <?xml version='1.0'?>
219 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
220 <platform version="3">
221 APPLICATIONHEAD
222
223 ##---- cache hostnames of hostfile---------------
224 if [ -n "${HOSTFILE}" ] && [ -f ${HOSTFILE} ]; then
225         hostnames=(`cat ${HOSTFILE} | tr \\\n " "`)
226       NUMHOSTS=`cat ${HOSTFILE} | wc -l`
227 fi
228
229 if [ "${EXEC}" = "./smpi_replay" ]; then
230   APP_TRACES=$1;
231   if [ -n "${APP_TRACES}" ] && [ -f ${APP_TRACES} ]; then
232      hosttraces=(`cat ${APP_TRACES} | tr \\\n " "`)
233      NUMTRACES=`cat ${APP_TRACES} | wc -l`
234   fi
235 fi
236
237 ##----------------------------------------------------------
238 ##  generate application.xml with hostnames from hostfile:
239 ##  the name of host_i (1<=i<=p, where -np p) is the line i
240 ##  in hostfile (where -hostfile hostfile), or "host$i" if
241 ##  hostfile has less than i lines.
242 ##----------------------------------------------------------
243
244 HAVE_SEQ="`which seq 2>/dev/null`"
245
246 if [ -n "${HAVE_SEQ}" ]; then
247         SEQ=`${HAVE_SEQ} 0 $((${NUMPROCS}-1))`
248 else
249       cnt=0
250         while (( $cnt < ${NUMPROCS} )) ; do
251             SEQ="$SEQ $cnt"
252             cnt=$((cnt + 1));
253         done
254 fi
255
256 ##---- generate <process> tags------------------------------
257
258 for i in ${SEQ}
259 do
260   if [ -n "${HOSTFILE}" ]; then
261         j=$(( $i % ${NUMHOSTS} ))
262   fi
263   ##---- optional display of ranks to process mapping
264   if [ -n "${MAPOPT}" ]; then
265         echo "[rank $i] -> ${hostnames[$j]}"
266   fi
267
268   if [ -z "${hostnames[$j]}" ]; then
269         host="host"$(($j+1))
270   else
271         host="${hostnames[$j]}"
272   fi
273   echo "  <process host=\"${host}\" function=\"$i\"> <!-- function name used only for logging -->" >> ${APPLICATIONTMP}
274   echo "    <argument value=\"$i\"/> <!-- rank -->" >> ${APPLICATIONTMP}
275   if [ "${EXEC}" = "./smpi_replay" ]; then
276     if  [ ${NUMTRACES} -gt 1 ]; then
277       echo "    <argument value=\"${hosttraces[$j]}\"/>" >> ${APPLICATIONTMP}
278     else
279       echo "    <argument value=\"${hosttraces[0]}\"/>" >> ${APPLICATIONTMP}
280     fi
281   else 
282     for ARG in $*; do
283        echo "    <argument value=\"${ARG}\"/>" >> ${APPLICATIONTMP}
284     done
285   fi
286   echo "  </process>" >> ${APPLICATIONTMP}
287 done
288
289 cat >> ${APPLICATIONTMP} <<APPLICATIONFOOT
290 </platform>
291 APPLICATIONFOOT
292 ##-------------------------------- end DEFAULT APPLICATION --------------------------------------
293
294 ##---------------------- SMPI TRACING OPTIONS ---------------------------------
295 if [ -n "${TRACE_ACTIVE}" ]; then
296   #define trace filename
297   if [ -z "${TRACE_FILENAME}" ]; then
298     TRACE_FILENAME="smpi_simgrid.trace"
299   fi
300   TRACEOPTIONS="--cfg=tracing:1 --cfg=tracing/filename:${TRACE_FILENAME} --cfg=tracing/smpi:1"
301
302   if [ -n "${TRACE_COMMENT}" ]; then
303     TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/comment:${TRACE_COMMENT}"
304   fi
305
306   if [ -n "${TRACE_COMMENT_FILE}" ]; then
307     TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/comment_file:${TRACE_COMMENT_FILE}"
308   fi
309
310   if [ -n "${TRACE_GROUPED}" ]; then
311     TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/smpi/group:1"
312   fi
313
314   if [ -n "${TRACE_RESOURCE}" ]; then
315     TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1"
316   fi
317
318   if [ -n "${TRACE_TRIVA}" ]; then
319     TRACEOPTIONS="${TRACEOPTIONS} --cfg=triva/categorized:smpi_cat.plist --cfg=triva/uncategorized:smpi_uncat.plist"
320   fi
321 fi
322 ##---------------------- end SMPI TRACING OPTIONS ---------------------------------
323
324 export SMPI_GLOBAL_SIZE=${NUMPROCS}
325 if [ -n "${KEEP}" ] ; then
326   echo ${EXEC} ${SIMOPTS} ${TRACEOPTIONS} ${PLATFORMTMP} ${APPLICATIONTMP}
327 fi
328 ${EXEC} ${SIMOPTS} ${TRACEOPTIONS} ${PLATFORMTMP} ${APPLICATIONTMP}
329 status=$?
330
331 if [ -z "${KEEP}" ] ; then
332    if [ -z "${PLATFORM}" ]; then
333         rm ${PLATFORMTMP}
334    fi
335    rm ${APPLICATIONTMP}
336 fi
337
338 exit $status