mpi-bluegeneq-smp changes.
[charm.git] / src / arch / shmem-crayxe / 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 machinefile=""
10
11 while [ $# -gt 0 ]
12 do
13         case $1 in
14         +ppn)
15                 args=$args" +ppn "$2
16                 shift
17                 ;;
18         +ppn*)
19                 args=$args" "$1
20                 ;;
21         +p)
22                 pes=$2
23                 shift
24                 ;;
25         +p*)
26                 pes=`echo $1 | awk '{print substr($1,3)}'`
27                 ;;
28         -machinefile)
29                 machinefile=$2
30                 args=" "$1" "$2" "$args
31                 shift
32                 ;;
33         *) 
34                 args=$args" "$1
35                 ;;
36         esac
37         shift
38 done
39
40
41 printf "\nRunning on $pes processors: $args\n"
42
43
44 if [ -n "$PBS_NODEFILE" ]
45 then
46 # we are in a job shell
47   aprun=`which aprun 2>/dev/null`
48   if test -n "$aprun"
49   then
50     echo aprun -n $pes $args
51     $aprun -n $pes $args
52   else
53     mpirun_cmd=`which mpirun 2>/dev/null`
54     if test -n "$mpirun_cmd"
55     then
56       if echo $mpirun_cmd | grep 'mvapich2'  > /dev/null 2>/dev/null
57       then
58         # if daemon not started, start it
59         if ! mpdtrace > /dev/null 2>/dev/null
60         then
61           mvapich2-start-mpd
62         fi
63         mpirun -np $pes $args
64         #    mpdallexit
65       else   # normal case
66         test -z "$machinefile" && args=-machinefile" "$PBS_NODEFILE" "$args
67         echo mpirun -np $pes $args
68         mpirun -np $pes $args
69       fi
70     else
71       echo "Charmrun> can not locate mpirun in order to run the program."
72       exit 1
73     fi
74   fi
75 elif [ -n "$LSB_HOSTS" ]
76 then
77 # Tungsten
78   echo cmpirun -lsf -poll -no_smp -gm_long 200000 $args 
79   cmpirun -lsf -poll -no_smp -gm_long 200000 $args 
80 elif [ -n "$PBS_QUEUE" -o -n "$LSF_QUEUE" ]
81 then
82 # Interactive mode: create, and submit a batch job
83         script="charmrun_script.$$.sh"
84         indir=`pwd`
85         output="$indir/charmrun_script.$$.stdout"
86         result="$indir/charmrun_script.$$.result"
87         rm -f $result
88 # Some machine specific 
89         USE_LSF=0
90 # 10 minutes    
91         walllimit=10
92         queue_stat=qstat
93         queue_qsub=qsub
94         queue_kill=qdel
95         hostname=`hostname`
96         case "$hostname" in
97         turing*.turing.uiuc.edu) 
98                 ppn='#PBS -l nodes='$pes':ppn=1'
99                 extra='-machinefile $PBS_NODEFILE'
100                 ;;
101         tg-login*|honest*.ncsa.uiuc.edu)
102                 # always ppn=2
103                 nodes=`expr \( $pes + 1 \) / 2`
104                 test $pes -eq 1 && ppns=1 || ppns=2
105                 ppn='#PBS -l nodes='$nodes':ppn='$ppns
106                 extra='-machinefile $PBS_NODEFILE'
107                 ;;
108         co-login*.ncsa.uiuc.edu)
109                 mem='#PBS -l mem=500mb'
110                 ncpus="#PBS -l ncpus=$pes"
111                 ;;
112         tun*)
113                 USE_LSF=1
114                 queue_stat=bjobs
115                 queue_qsub=bsub
116                 queue_kill=bkill
117                 ;;
118         abe*)
119                 # always ppn=2
120                 nodes=`expr \( $pes + 1 \) / 2`
121                 test $pes -eq 1 && ppns=1 || ppns=2
122                 ppn='#PBS -l nodes='$nodes':ppn='$ppns
123                 extra='-machinefile $PBS_NODEFILE'
124                 ;;
125         kraken*)
126                 ncores=`expr \( $pes + 11 \) / 12 \* 12`
127                 ncpus="#PBS -l size=$ncores"
128                 ;;
129         *)
130                 ncpus="#PBS -l ncpus=$pes"
131                 ;;
132         esac
133         if test $USE_LSF -eq 0
134         then
135           mpirun=`which mpirun 2>/dev/null`
136           npcmd="-np "
137           if test -z "$mpirun"
138           then
139             mpirun=`which aprun 2>/dev/null`
140             npcmd="-n "
141           fi
142           cat > $script << EOF
143 #!/bin/sh
144 # This is a charmrun-generated PBS batch job script.
145 # The lines starting with #PBS are queuing system flags:
146 #
147 $ppn
148 #
149 $ncpus
150 #
151 #PBS -l walltime=$walllimit:00
152 #
153 $mem
154 #
155 #PBS -q $PBS_QUEUE
156 #
157 #PBS -N autobuild
158 #
159 #PBS -j oe
160 #
161 #PBS -o $output
162
163 cd $indir
164
165 cat \$PBS_NODEFILE
166 echo $mpirun $npcmd $pes $extra $args
167 $mpirun $npcmd $pes $extra $args
168
169 # Save mpirun exit status
170 status=\$?
171 echo \$status > $result
172 EOF
173         else
174 #  use LSF
175           mpirun="cmpirun -lsf -poll -no_smp -gm_long 200000"
176           cat > $script << EOF
177 #!/bin/sh
178 # This is a charmrun-generated PBS batch job script.
179 # The lines starting with #PBS are queuing system flags:
180 #
181 #BSUB -J autobuild
182 #BSUB -W 0:$walllimit
183 #BSUB -n $pes
184 #BSUB -o $output
185
186 cd $indir
187 echo \$LSB_MCPU_HOSTS
188 $mpirun $args
189 # Save mpirun exit status
190 status=\$?
191 echo \$status > $result
192 EOF
193         fi
194
195 End() {
196         echo "Charmrun> $queue_kill $jobid ..."
197         $queue_kill $jobid
198         rm -f $script
199         exit $1
200 }
201
202         echo "Submitting batch job for> $mpirun -np $pes $args"
203         echo " using the command> $queue_qsub $script"
204         chmod 755 $script
205         while [ -z "$jobid" ]
206         do
207           [ $USE_LSF = 0 ] && jobid=`$queue_qsub $script|tail -1`
208           [ $USE_LSF = 1 ] && jobid=`$queue_qsub < $script|tail -1|sed -e 's/[^0-9]*//g'`
209         done
210         echo "Job enqueued under job ID $jobid"
211 # kill job if interrupted
212         trap 'End 1' 2 3
213         retry=0
214 # Wait for the job to complete, by checking its status
215         while [ true ]
216         do
217                 $queue_stat $jobid > tmp.$$
218                 exitstatus=$?
219                 if test -f $output
220                 then
221 # The job is done-- print its output
222                         rm tmp.$$
223 # When job hangs, result file does not exist
224                         test -f $result && status=`cat $result` || status=1
225                         test $status -eq 0 && status=`grep 'End of program' $output > /dev/null 2>&1`
226                         cat $output
227                         rm -f $result
228                         test -f $status && rm -f $script $output
229                         exit $status
230                 fi
231 # The job is still queued or running-- print status and wait
232                 tail -1 tmp.$$
233                 rm tmp.$$
234 # Job ID may not exist now
235                 if test $exitstatus -ne 0
236                 then
237 # retry a few times when error occurs
238                         retry=`expr $retry + 1`
239                         if test $retry -gt 6
240                         then
241                                 echo "Charmrun> too many errors, abort!"
242                                 exit 1
243                         else
244                                 sleep 15
245                         fi
246                 else
247 # job still in queue
248                         retry=0
249                         sleep 20
250                 fi
251         done
252 else
253   mpirun_cmd=`which mpirun 2>/dev/null`
254   if test -n "$mpirun_cmd"
255   then
256     [ -n "$MPI_MACHINEFILE" ] && args=" -machinefile $MPI_MACHINEFILE $args"
257     setarch_cmd=`which setarch 2>/dev/null`
258     if [ -n "$setarch_cmd" -a -x "$setarch_cmd" ]
259     then
260       # Disables randomization of the virtual address  space  (turns  on
261       #          ADDR_NO_RANDOMIZE).
262       cur_arch=`uname -m`
263       echo "charmrun>  $setarch_cmd $cur_arch -R  mpirun -np $pes $args"
264       $setarch_cmd $cur_arch -R  mpirun -np $pes $args
265     else
266       echo "charmrun> mpirun -np $pes $args"
267       mpirun -np $pes $args
268     fi
269   else
270     mpiexec_cmd=`which mpiexec 2>/dev/null`
271     if test -n "$mpiexec_cmd"
272     then
273       echo "charmrun> $mpiexec_cmd -n $pes $args"
274       echo
275       "$mpiexec_cmd" -n $pes $args
276     else
277       echo "Don't know how to run MPI program."
278       exit 1
279     fi
280   fi
281 fi
282
283