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