Merged arrays into Charj mainline.
[charm.git] / src / arch / lapi / charmrun
1 #!/bin/sh
2 #
3 # Conv-host for IBM SP:
4 #  Translates +pN-style charmrun options into 
5 # POE (Parallel Operating Environment) options.
6
7 args=""
8 pes=1
9
10 while [ $# -gt 0 ]
11   do
12   case $1 in
13       +p)
14           pes=$2
15           shift
16           ;;
17       +ppn)
18           args=$args"$1 $2 "
19           ppnused="$2"
20           shift
21           ;;
22       +p[0-9]*)
23           pes=`expr substr $1 3 10`
24           ;;
25       +ppn[0-9]*)
26           ppnused=`expr substr $1 5 12`
27           args=$args"+ppn $ppnused "
28           ;;
29       +n)
30           nodes=$2
31           shift
32           ;;
33       +ln)
34           logical=$2
35           shift
36           ;;
37       +ns)
38           nodesize=$2
39           shift
40           ;;
41       +ll)
42           llfile=$2
43           shift
44           ;;
45       +name)
46           jobname=$2
47           shift
48           ;;
49       *)
50           args=$args"$1 "
51           ;;
52   esac
53   shift
54 done
55
56 if [ -n "$args" ]
57     then
58     args1=`expr substr "$args" 1 1`
59 fi
60
61 if [ -z "$args" -o "$args1" == "-" -o "$args1" == "+" ]
62     then
63     # print usage help
64     echo "help"
65     exit
66 fi
67
68 executable=`echo $args | awk '{print $1}'`
69 args=`echo ${args#*$executable}`
70
71 # check if the node size has been set, or a file called .nodesize is present
72 #if [ -z "$nodesize" ]
73 #    then
74 #    if [ -f ".nodesize" ]
75 #       then
76 #       nodesize=`cat .nodesize`
77 #    elif [ -f "$HOME/.nodesize" ]
78 #       then
79 #       nodesize=`cat $HOME/.nodesize`
80 #    fi
81 #fi
82
83 # check that nodesize is a real number
84 #if [ -n "$nodesize" -a "$nodesize" -gt 0 ]
85 #    then
86 #    echo
87 #    else
88 #    echo
89 #    echo "No node size specified. Either use flag \"+ns <size>\" or create a file called"
90 #    echo "\".nodesize\" in the current directory on in your home directory."
91 #    echo
92 #    exit
93 #fi
94
95 # check if the load leveler template file has been set or a file called charmrun.ll is present
96 if [ -z "$llfile" ]
97     then
98     if [ -f "charmrun.ll" ]
99         then
100         llfile="charmrun.ll"
101     elif [ -f "$HOME/charmrun.ll" ]
102         then
103         llfile="$HOME/charmrun.ll"
104     fi
105 fi
106
107 if [ -z "$llfile" ]
108     then
109     echo "No load leveler template specified. Either use the flag \"+ll <llfile>\" or create"
110     echo "a file called \"charmrun.ll\" in the current directory on in your home directory."
111     echo "An example of the template can be found at src/arch/lapi/charmrun.ll, this may"
112     echo "require tuning for the specific machine (for example account_no or class)."
113     echo
114     exit
115 fi
116
117 if [ -n "$ppnused" ]
118 then
119 if [ $ppnused -gt 0 ]
120     then
121 #The MALLOCMULTIHEAP env var helps to improve the memory allocation performance
122 #by splitting the heap into multiple parts where each thread has its
123 #own access without locks. However, enabling this var will increase the memory
124 #usage, so we only use it when it's a smp run.
125     heaps=`expr $ppnused + 1`
126     if [ $heaps -gt 32 ]
127         then
128         heaps=32
129     fi
130     export MALLOCMULTIHEAP=heaps:$heaps
131 fi
132 fi
133
134 filename="charmrun_script.$$.ll"
135 interactive=`grep queue $llfile|wc -l`
136
137 if [ $interactive -gt 1 ]
138     then
139     echo "Multiple queueing not supported!"
140 fi
141
142 if [ $interactive -eq 0 ]
143 then
144     node_usage="shared"
145 else
146     node_usage="not_shared"
147 fi
148
149 if [ -n "$ppnused" ]
150     then
151     total_tasks=`expr $pes / $ppnused`
152     if [ $pes -ne `expr $total_tasks \* $ppnused` ]
153         then
154         echo
155         echo "number of processors must be a multiple of number of processors per node!"
156         echo
157         exit
158     fi
159     tasks_per_node=1
160     if [ -n "$logical" ]
161         then
162         tasks_per_node=$logical
163     fi
164     if [ -n "$nodesize" ]
165         then
166         tasks_per_node=`expr $nodesize / $ppnused`
167     else
168         echo "WARNING: ns (node size) is missing, it should be used together with ppn!"
169     fi
170     if [ -n "$logical" -a -n "$nodesize" ]
171         then if [ $logical -ne $tasks_per_node ]
172             then
173             echo
174             echo "Both +ln and +ns used, but they do not meet the rule <+ln> = <+ns> / <+ppn>"
175             echo
176             exit
177         fi
178     fi
179     nodes=`expr $total_tasks / $tasks_per_node`
180     if [ `expr $nodes '*' $tasks_per_node` -ne $total_tasks ]
181       then
182       nodes=`expr $nodes + 1` 
183     fi 
184     if [ $tasks_per_node -gt $total_tasks ]
185       then
186       tasks_per_node=$total_tasks
187     fi
188     nodes="#@ node ="$nodes
189     tasks_per_node="#@ tasks_per_node = "$tasks_per_node
190     total_tasks=""
191 else
192     total_tasks=$pes
193     if test -z "$nodes"
194     then
195       ppn=`prtconf 2>/dev/null | grep 'Number Of Processors:' | sed -e 's/^[^0-9]*//'`
196       test x$ppn = x && ppn=4
197       if [ `expr $pes / $ppn '*' $ppn` -eq $pes ]
198       then
199         nodes=`expr $pes / $ppn`
200       else
201         nodes=`expr $pes / $ppn + 1`
202       fi
203     fi
204     nodes="#@ node = "$nodes
205     total_tasks="#@ total_tasks = "$total_tasks 
206 fi
207
208 cat > $filename <<EOF
209 # System settings
210 #@ node_usage = $node_usage
211 #@ network.LAPI = csss,,US
212 $total_tasks
213 $nodes
214 $tasks_per_node
215
216 # User settings
217 EOF
218
219 grep -E -v "node|network|tasks|queue" $llfile | grep -E "#@"  >> $filename
220
221 cat >> $filename <<EOF
222
223 # Default Settings
224 EOF
225 present=`grep job_type $llfile|wc -l`
226 if [ $present -eq 0 ]
227     then
228     cat >> $filename <<EOF
229 #@ job_type = parallel
230 EOF
231 fi
232
233 if [ -z "$jobname" ]
234     then
235     jobname=$executable
236 fi
237
238 present=`grep job_name $llfile|wc -l`
239 if [ $present -eq 0 ]
240     then
241     cat >> $filename <<EOF
242 #@ job_name = charmrun_$jobname.$$
243 EOF
244 fi
245
246 present=`grep wall_clock_limit $llfile|wc -l`
247 if [ $present -eq 0 ]
248     then
249     cat >> $filename <<EOF
250 #@ wall_clock_limit = 0:10:00
251 EOF
252 fi
253
254 present=`grep notification $llfile|wc -l`
255 if [ $present -eq 0 ]
256     then
257     cat >> $filename <<EOF
258 #@ notification = never
259 EOF
260 fi
261
262 if [ $interactive -ne 0 ]
263     then
264     present=`grep output $llfile|wc -l`
265     if [ $present -eq 0 ]
266         then
267         cat >> $filename <<EOF
268 #@ output = output_$jobname.$$
269 EOF
270     fi
271
272     present=`grep error $llfile|wc -l`
273     if [ $present -eq 0 ]
274         then
275         cat >> $filename <<EOF
276 #@ error = error_$jobname.$$
277 EOF
278     fi
279 fi
280  
281 cat >> $filename <<EOF
282 #@ queue
283
284 # System defined exports
285 MP_MSG_API=lapi
286 LAPI_USE_SHM=yes
287 MP_INTRDELAY=100
288 MP_EAGER_LIMIT=65536
289 MP_SHARED_MEMORY=yes
290 MP_USE_BULK_XFER=yes
291 MEMORY_AFFINITY=MCM
292 MP_TASK_AFFINITY=MCM
293 MP_EUILIB=us
294
295 # User defined exports
296 EOF
297
298 # user exports
299 grep -E -v "#@" $llfile | grep "export" >> $filename
300
301 if [ ! -x "$executable" ]
302     then
303     executable = "$PWD/$executable"
304 fi
305 if [ ! -x "$executable" ]
306     then
307     echo "Executable not found: $executable"
308     exit
309 fi
310
311 if [ $interactive -eq 0 ]
312     then
313     # submit the job as poe, iterating 
314     echo "Running interactively> poe $executable $args -llfile $filename"
315     poe $executable $args -llfile $filename
316     status=$?
317     if [ $status -eq 255 ];
318       then
319       llstatus=1
320     else
321       llstatus=0
322     fi
323     until (exit $llstatus);
324       do
325       echo "Retrying in two minutes..."
326       sleep 120
327       poe $executable $args -llfile $filename;
328       status=$?
329       if [ $status -eq 255 ];
330         then
331         llstatus=1
332       else
333         llstatus=0
334       fi
335     done
336     if [ $status -ne 0 ];then exit $status;fi
337     
338 else
339     # append the command at the end of the file and llsubmit it
340     echo "Submitting batch> poe $executable $args"
341     cat >> $filename <<EOF
342
343 poe $executable $args
344 EOF
345     llsubmit $filename
346 fi
347
348 rm $filename