removed PWD.
[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 filename="charmrun_script.$$.ll"
113 interactive=`grep queue $llfile|wc -l`
114
115 if [ $interactive -gt 1 ]
116     then
117     echo "Multiple queueing not supported!"
118 fi
119
120 if [ $interactive -eq 0 ]
121 then
122     node_usage="shared"
123 else
124     node_usage="not_shared"
125 fi
126
127 if [ -n "$ppnused" ]
128     then
129     total_tasks=`expr $pes / $ppnused`
130     if [ $pes -ne `expr $total_tasks \* $ppnused` ]
131         then
132         echo
133         echo "number of processors must be a multiple of number of processors per node!"
134         echo
135         exit
136     fi
137     tasks_per_node=1
138     if [ -n "$logical" ]
139         then
140         tasks_per_node=$logical
141     fi
142     if [ -n "$nodesize" ]
143         then
144         tasks_per_node=`expr $nodesize / $ppnused`
145     else
146         echo "WARNING: ns (node size) is missing, it should be used together with ppn!"
147     fi
148     if [ -n "$logical" -a -n "$nodesize" ]
149         then if [ $logical -ne $tasks_per_node ]
150             then
151             echo
152             echo "Both +ln and +ns used, but they do not meet the rule <+ln> = <+ns> / <+ppn>"
153             echo
154             exit
155         fi
156     fi
157     nodes=`expr $total_tasks / $tasks_per_node`
158     if [ `expr $nodes '*' $tasks_per_node` -ne $total_tasks ]
159       then
160       nodes=`expr $nodes + 1` 
161     fi 
162     if [ $tasks_per_node -gt $total_tasks ]
163       then
164       tasks_per_node=$total_tasks
165     fi
166     nodes="#@ node ="$nodes
167     tasks_per_node="#@ tasks_per_node = "$tasks_per_node
168     total_tasks=""
169 else
170     total_tasks=$pes
171     if test -z "$nodes"
172     then
173       ppn=`prtconf 2>/dev/null | grep 'Number Of Processors:' | sed -e 's/^[^0-9]*//'`
174       test x$ppn = x && ppn=4
175       if [ `expr $pes / $ppn '*' $ppn` -eq $pes ]
176       then
177         nodes=`expr $pes / $ppn`
178       else
179         nodes=`expr $pes / $ppn + 1`
180       fi
181     fi
182     nodes="#@ node = "$nodes
183     total_tasks="#@ total_tasks = "$total_tasks 
184 fi
185
186 cat > $filename <<EOF
187 # System settings
188 #@ node_usage = $node_usage
189 #@ network.LAPI = csss,,US
190 $total_tasks
191 $nodes
192 $tasks_per_node
193
194 # User settings
195 EOF
196
197 grep -E -v "node|network|tasks|queue" $llfile | grep -E "#@"  >> $filename
198
199 cat >> $filename <<EOF
200
201 # Default Settings
202 EOF
203 present=`grep job_type $llfile|wc -l`
204 if [ $present -eq 0 ]
205     then
206     cat >> $filename <<EOF
207 #@ job_type = parallel
208 EOF
209 fi
210
211 if [ -z "$jobname" ]
212     then
213     jobname=$executable
214 fi
215
216 present=`grep job_name $llfile|wc -l`
217 if [ $present -eq 0 ]
218     then
219     cat >> $filename <<EOF
220 #@ job_name = charmrun_$jobname.$$
221 EOF
222 fi
223
224 present=`grep wall_clock_limit $llfile|wc -l`
225 if [ $present -eq 0 ]
226     then
227     cat >> $filename <<EOF
228 #@ wall_clock_limit = 0:10:00
229 EOF
230 fi
231
232 present=`grep notification $llfile|wc -l`
233 if [ $present -eq 0 ]
234     then
235     cat >> $filename <<EOF
236 #@ notification = never
237 EOF
238 fi
239
240 if [ $interactive -ne 0 ]
241     then
242     present=`grep output $llfile|wc -l`
243     if [ $present -eq 0 ]
244         then
245         cat >> $filename <<EOF
246 #@ output = output_$jobname.$$
247 EOF
248     fi
249
250     present=`grep error $llfile|wc -l`
251     if [ $present -eq 0 ]
252         then
253         cat >> $filename <<EOF
254 #@ error = error_$jobname.$$
255 EOF
256     fi
257 fi
258  
259 cat >> $filename <<EOF
260 #@ queue
261
262 # System defined exports
263 MP_MSG_API=lapi
264 LAPI_USE_SHM=yes
265 MP_INTRDELAY=100
266 MP_EAGER_LIMIT=65536
267 MP_SHARED_MEMORY=yes
268 MP_USE_BULK_XFER=yes
269 MEMORY_AFFINITY=MCM
270 MP_TASK_AFFINITY=MCM
271 MP_EUILIB=us
272
273 # User defined exports
274 EOF
275
276 # user exports
277 grep -E -v "#@" $llfile | grep "export" >> $filename
278
279 if [ ! -x "$executable" ]
280     then
281     echo "Executable not found: $executable"
282     exit
283 fi
284
285 if [ $interactive -eq 0 ]
286     then
287     # submit the job as poe, iterating 
288     echo "Running interactively> poe $args -llfile $filename"
289     poe $args -llfile $filename
290     status=$?
291     if [ $status -eq 255 ];
292       then
293       llstatus=1
294     else
295       llstatus=0
296     fi
297     until (exit $llstatus);
298       do
299       echo "Retrying in two minutes..."
300       sleep 120
301       poe $args -llfile $filename;
302       status=$?
303       if [ $status -eq 255 ];
304         then
305         llstatus=1
306       else
307         llstatus=0
308       fi
309     done
310     if [ $status -ne 0 ];then exit $status;fi
311     
312 else
313     # append the command at the end of the file and llsubmit it
314     echo "Submitting batch> poe $args"
315     cat >> $filename <<EOF
316
317 poe $args
318 EOF
319     llsubmit $filename
320 fi
321
322 rm $filename