a minor fix for charmrun script change I checked in last time.
[charm.git] / src / arch / mpi / charmrun
1 #!/bin/sh
2 #
3 # Conv-host for MPI:
4 #  Translates +pN-style conv-host options into 
5 # mpirun -npN options.
6
7 args=""
8 pes=1
9
10 while [ $# -gt 0 ]
11 do
12         case $1 in
13         +ppn)
14                 args=$args" +ppn "$2
15                 shift
16                 ;;
17         +ppn*)
18                 args=$args" "$1
19                 ;;
20         +p)
21                 pes=$2
22                 shift
23                 ;;
24         +p*)
25                 pes=`echo $1 | awk '{print substr($1,3)}'`
26                 ;;
27         *) 
28                 args=$args" "$1
29                 ;;
30         esac
31         shift
32 done
33
34 printf "\nRunning on $pes processors: $args\n"
35
36 if [ -n "$PBS_NODEFILE" ]
37 then
38 # we are in a job shell
39   mpirun_cmd=`which mpirun`
40   if echo $mpirun_cmd | grep 'mvapich2'  > /dev/null 2>/dev/null
41   then
42     mvapich2-start-mpd
43     mpirun -np $pes $args
44     mpdallexit
45   else   # normal case
46     echo mpirun -np $pes -machinefile $PBS_NODEFILE $args
47     mpirun -np $pes -machinefile $PBS_NODEFILE $args
48   fi
49 elif [ -n "$LSB_HOSTS" ]
50 then
51 # Tungsten
52   echo cmpirun -lsf -poll -no_smp -gm_long 200000 $args 
53   cmpirun -lsf -poll -no_smp -gm_long 200000 $args 
54 elif [ -n "$PBS_QUEUE" -o -n "$LSF_QUEUE" ]
55 then
56 # Interactive mode: create, and submit a batch job
57         script="charmrun_script.$$.sh"
58         indir=`pwd`
59         output="$indir/charmrun_script.$$.stdout"
60         result="$indir/charmrun_script.$$.result"
61         rm -f $result
62 # Some machine specific 
63         USE_LSF=0
64 # 10 minutes    
65         walllimit=10
66         queue_stat=qstat
67         queue_qsub=qsub
68         queue_kill=qdel
69         hostname=`hostname`
70         case "$hostname" in
71         turing*.turing.uiuc.edu) 
72                 ppn='#PBS -l nodes='$pes':ppn=1'
73                 extra='-machinefile $PBS_NODEFILE'
74                 ;;
75         tg-login*|honest*.ncsa.uiuc.edu)
76                 # always ppn=2
77                 nodes=`expr \( $pes + 1 \) / 2`
78                 test $pes -eq 1 && ppns=1 || ppns=2
79                 ppn='#PBS -l nodes='$nodes':ppn='$ppns
80                 extra='-machinefile $PBS_NODEFILE'
81                 ;;
82         co-login*.ncsa.uiuc.edu)
83                 mem='#PBS -l mem=500mb'
84                 ncpus="#PBS -l ncpus=$pes"
85                 ;;
86         tun*)
87                 USE_LSF=1
88                 queue_stat=bjobs
89                 queue_qsub=bsub
90                 queue_kill=bkill
91                 ;;
92         *)
93                 ncpus="#PBS -l ncpus=$pes"
94                 ;;
95         esac
96         if test $USE_LSF -eq 0
97         then
98           mpirun=`which mpirun`
99           cat > $script << EOF
100 #!/bin/sh
101 # This is a charmrun-generated PBS batch job script.
102 # The lines starting with #PBS are queuing system flags:
103 #
104 $ppn
105 #
106 $ncpus
107 #
108 #PBS -l walltime=$walllimit:00
109 #
110 $mem
111 #
112 #PBS -q $PBS_QUEUE
113 #
114 #PBS -N autobuild
115 #
116 #PBS -j oe
117 #
118 #PBS -o $output
119
120 cd $indir
121
122 cat \$PBS_NODEFILE
123 $mpirun -np $pes $extra $args
124
125 # Save mpirun exit status
126 status=\$?
127 echo \$status > $result
128 EOF
129         else
130 #  use LSF
131           mpirun="cmpirun -lsf -poll -no_smp -gm_long 200000"
132           cat > $script << EOF
133 #!/bin/sh
134 # This is a charmrun-generated PBS batch job script.
135 # The lines starting with #PBS are queuing system flags:
136 #
137 #BSUB -J autobuild
138 #BSUB -W 0:$walllimit
139 #BSUB -n $pes
140 #BSUB -o $output
141
142 cd $indir
143 echo \$LSB_MCPU_HOSTS
144 $mpirun $args
145 # Save mpirun exit status
146 status=\$?
147 echo \$status > $result
148 EOF
149         fi
150
151 End() {
152         echo "Charmrun> $queue_kill $jobid ..."
153         $queue_kill $jobid
154         rm -f $script
155         exit $1
156 }
157
158         echo "Submitting batch job for> $mpirun -np $pes $args"
159         echo " using the command> $queue_qsub $script"
160         chmod 755 $script
161         while [ -z "$jobid" ]
162         do
163           [ $USE_LSF = 0 ] && jobid=`$queue_qsub $script|tail -1`
164           [ $USE_LSF = 1 ] && jobid=`$queue_qsub < $script|tail -1|sed -e 's/[^0-9]*//g'`
165         done
166         echo "Job enqueued under job ID $jobid"
167 # kill job if interrupted
168         trap 'End 1' 2 3
169         retry=0
170 # Wait for the job to complete, by checking its status
171         while [ true ]
172         do
173                 $queue_stat $jobid > tmp.$$
174                 exitstatus=$?
175                 if test -f $output
176                 then
177 # The job is done-- print its output
178                         rm tmp.$$
179 # When job hangs, result file does not exist
180                         test -f $result && status=`cat $result` || status=1
181                         test $status -eq 0 && status=`grep 'End of program' $output > /dev/null 2>&1`
182                         cat $output
183                         rm -f $result
184                         test -f $status && rm -f $script $output
185                         exit $status
186                 fi
187 # The job is still queued or running-- print status and wait
188                 tail -1 tmp.$$
189                 rm tmp.$$
190 # Job ID may not exist now
191                 if test $exitstatus -ne 0
192                 then
193 # retry a few times when error occurs
194                         retry=`expr $retry + 1`
195                         if test $retry -gt 6
196                         then
197                                 echo "Charmrun> too many errors, abort!"
198                                 exit 1
199                         else
200                                 sleep 15
201                         fi
202                 else
203 # job still in queue
204                         retry=0
205                         sleep 20
206                 fi
207         done
208 else
209   [ -n "$MPI_MACHINEFILE" ] && args=" -machinefile $MPI_MACHINEFILE $args"
210   echo "charmrun> mpirun -np $pes $args"
211   mpirun -np $pes $args
212 fi
213
214