Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Added MPI_CHAR to predefined reduce operations (not in the standard, but convenient...
[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 NUMPROCS="${DEFAULT_NUMPROCS}"
17 POWER="${DEFAULT_POWER}"
18
19 SIMOPTS="--cfg=network/model:SMPI --cfg=TCP_gamma:4194304"
20
21 while true; do
22   case "$1" in
23    "-np" | "-n")
24       NUMPROCS="$2"
25       shift 2
26     ;;
27    "-bandwidth")
28       NETWORK_BANDWIDTH="$2"
29       shift 2
30     ;;
31    "-latency")
32       NETWORK_LATENCY="$2"
33       shift 2
34     ;;
35    "-platform")
36         PLATFORM="$2"
37       if [ ! -f ${PLATFORM} ]; then
38                 echo "[$0] ** error: the file '${PLATFORM}' does not exist. Aborting."
39                 exit 1
40       fi
41         shift 2
42     ;;
43    "-hostfile")
44         HOSTFILE="$2"
45       if [ ! -f ${HOSTFILE} ]; then
46                 echo "[$0] ** error: the file '${HOSTFILE}' does not exist. Aborting."
47                 exit 1
48       fi
49         shift 2
50     ;;
51
52    "-map")
53         MAPOPT="true"
54       shift 1
55    ;;
56
57    "-keep-temps")
58         KEEP="true"
59       shift 1
60    ;;
61
62    "-help" | "--help" | "-h")
63       echo "usage:"
64       echo "$0 [-quiet] [-keep-temps] [-np <numprocs>] -platform <xmldesc> -hostfile <hostfile> [-map] program [program-options]"
65       echo "or (deprecated usage):"
66       echo "$0 [-quiet] [-keep-temps] [-np <numprocs>] [-bandwidth <bytes/sec>] [-latency <secs>] program [program-options]"
67       echo
68       exit
69    ;;
70
71    "--cfg="*|"--log="*)
72      for OPT in ${1#*=}
73      do
74        SIMOPTS="$SIMOPTS ${1%%=*}=$OPT"
75      done
76      shift 1
77    ;;
78     *)
79       break
80     ;;
81   esac
82 done
83
84 EXEC="$1"
85 shift
86
87 ##-----------------------------------
88
89
90
91
92 ##-------------------------------- DEFAULT or SPECIFIED PLATFORM --------------------------------------
93 if [ -z "${PLATFORM}" ]; then
94         PLATFORMTMP="$(mktemp tmpXXXXXX)"
95
96         cat > ${PLATFORMTMP} <<PLATFORMHEAD
97 <?xml version='1.0'?>
98 <!DOCTYPE platform SYSTEM "simgrid.dtd">
99 <platform version="2">
100 PLATFORMHEAD
101
102 for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
103   echo "  <host id=\"host$i\" power=\"${POWER}\"/>" >> ${PLATFORMTMP}
104   echo "  <link id=\"loop$i\" bandwidth=\"${LOOPBACK_BANDWIDTH}\" latency=\"${LOOPBACK_LATENCY}\"/>" >> ${PLATFORMTMP}
105   echo "  <link id=\"link$i\" bandwidth=\"${NETWORK_BANDWIDTH}\" latency=\"${NETWORK_LATENCY}\"/>" >> ${PLATFORMTMP}
106 done
107
108 for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
109   for (( j=${NUMPROCS}; $j ; j=$j-1 )) do
110     if [ $i -eq $j ]; then
111       echo "  <route src=\"host$i\" dst=\"host$j\"><link:ctn id=\"loop$i\"/></route>" >> ${PLATFORMTMP}
112     else
113       echo "  <route src=\"host$i\" dst=\"host$j\"><link:ctn id=\"link$i\"/><link:ctn id=\"link$j\"/></route>" >> ${PLATFORMTMP}
114     fi
115   done
116 done
117
118 cat >> ${PLATFORMTMP} <<PLATFORMFOOT
119 </platform>
120 PLATFORMFOOT
121
122 else
123         PLATFORMTMP=${PLATFORM}
124 fi
125 ##-------------------------------- end DEFAULT or SPECIFIED PLATFORM --------------------------------------
126
127 ##-------------------------------- DEFAULT APPLICATION --------------------------------------
128 APPLICATIONTMP="$(mktemp tmpXXXXXX)"
129 #APPLICATIONTMP="app.xml"
130
131
132 cat > ${APPLICATIONTMP} <<APPLICATIONHEAD
133 <?xml version='1.0'?>
134 <!DOCTYPE platform SYSTEM "simgrid.dtd">
135 <platform version="2">
136 APPLICATIONHEAD
137
138 ##---- cache hostnames of hostfile---------------
139 if [ -n "${HOSTFILE}" ] && [ -f ${HOSTFILE} ]; then
140         hostnames=(`cat ${HOSTFILE} | tr \\\n " "`)
141       NUMHOSTS=`cat ${HOSTFILE} | wc -l`
142 fi
143
144 ##----------------------------------------------------------
145 ##  generate application.xml with hostnames from hostfile:
146 ##  the name of host_i (1<=i<=p, where -np p) is the line i
147 ##  in hostfile (where -hostfile hostfile), or "host$i" if
148 ##  hostfile has less than i lines.
149 ##----------------------------------------------------------
150
151 HAVE_SEQ="`which seq 2>/dev/null`"
152
153 if [ -n "${HAVE_SEQ}" ]; then
154         SEQ=`${HAVE_SEQ} 0 $((${NUMPROCS}-1))`
155 else
156       cnt=0
157         while (( $cnt < ${NUMPROCS} )) ; do
158             SEQ="$SEQ $cnt"
159             cnt=$((cnt + 1));
160         done
161 fi
162
163 ##---- generate <process> tags------------------------------
164
165 for i in ${SEQ}
166 do
167   if [ -n "${HOSTFILE}" ]; then
168         j=$(( $i % ${NUMHOSTS} ))
169   fi
170   ##---- optional display of ranks to process mapping
171   if [ -n "${MAPOPT}" ]; then
172         echo "[rank $i] -> ${hostnames[$j]}"
173   fi
174
175   if [ -z "${hostnames[$j]}" ]; then
176         host="host"$(($j+1))
177   else
178         host="${hostnames[$j]}"
179   fi
180   echo "  <process host=\"${host}\" function=\"smpi_simulated_main\">" >> ${APPLICATIONTMP}
181   echo "    <argument value=\"$i\"/> <!-- rank -->" >> ${APPLICATIONTMP}
182   for ARG in $*; do
183     echo "    <argument value=\"${ARG}\"/>" >> ${APPLICATIONTMP}
184   done
185   echo "  </process>" >> ${APPLICATIONTMP}
186 done
187
188 cat >> ${APPLICATIONTMP} <<APPLICATIONFOOT
189 </platform>
190 APPLICATIONFOOT
191 ##-------------------------------- end DEFAULT APPLICATION --------------------------------------
192
193 if [ -n "${KEEP}" ] ; then
194   echo ${EXEC} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP}
195 fi
196 ${EXEC} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP}
197
198 if [ -z "${KEEP}" ] ; then
199    if [ -z "${PLATFORM}" ]; then
200         rm ${PLATFORMTMP}
201    fi
202    rm ${APPLICATIONTMP}
203 fi