1 |
#!/bin/bash |
2 |
|
3 |
# Escript/Finley wrapper for python |
4 |
# Sets LD_LIBRARY_PATH and PYTHONPATH and then runs either python or the MPI launcher |
5 |
|
6 |
#Extra paths can be configured about a page further down |
7 |
#Search for EXTRA_PATH="" |
8 |
|
9 |
#set to 1 if performing this is a standalone build and ../../pkg contains the relevant tools |
10 |
STANDALONE=0 |
11 |
|
12 |
#set to 1 if this is part of a packaged build (.deb) and files will be installed in standard locations |
13 |
#rather than everything in a single directory |
14 |
#Do not use this together with $STANDALONE |
15 |
STDLOCATION=0 |
16 |
|
17 |
#Now we find the location of this script |
18 |
#Note that this location should be absolute but does not need to be unique |
19 |
scriptdir="" |
20 |
CURDIR=`pwd` |
21 |
|
22 |
#Environment vars which control operations: |
23 |
# ESCRIPT_NUM_NODES, ESCRIPT_NUM_PROCS, ESCRIPT_NUM_THREADS, ESCRIPT_HOSTFILE, ESCRIPT_CREATESTDFILES |
24 |
|
25 |
HOSTFILE=/tmp/escript.$USER.$$ |
26 |
HOSTFILE2=/tmp/escript2.$USER.$$ |
27 |
|
28 |
#Begin finding ESCRIPT_ROOT |
29 |
if [ $STDLOCATION -ne 0 ] |
30 |
then |
31 |
ESCRIPT_ROOT=/usr/lib/escript |
32 |
else |
33 |
#We don't know the escript root so we need to work it out from the invocation |
34 |
#Need to match if the name contains / |
35 |
if [[ $0 =~ / ]] |
36 |
then |
37 |
# We are not using the PATH to find the script |
38 |
cd "`dirname $0`" |
39 |
scriptdir=`pwd` |
40 |
cd "$CURDIR" |
41 |
else |
42 |
# name does not contain / therefore we are using |
43 |
tscriptdir=`which $0` |
44 |
if [ $? -ne 0 ] |
45 |
then |
46 |
echo "Error! Unable to determine script directory. Exiting." |
47 |
exit 1 |
48 |
fi |
49 |
scriptdir=`dirname $tscriptdir` |
50 |
fi |
51 |
|
52 |
cd "$scriptdir/.." |
53 |
ESCRIPT_ROOT=`pwd` |
54 |
cd .. |
55 |
ESCRIPT_PARENT=`pwd` |
56 |
cd "$CURDIR" |
57 |
|
58 |
fi |
59 |
##### End finding ESCRIPT_ROOT ######## |
60 |
|
61 |
|
62 |
|
63 |
PYTHON_MPI_NULL="$ESCRIPT_ROOT/lib/pythonMPI" |
64 |
PYTHON_MPI_REDIRECT="$ESCRIPT_ROOT/lib/pythonMPIredirect" |
65 |
PYTHON_CMD=python |
66 |
|
67 |
# if possible please express paths relative to $ESCRIPT_ROOT unless |
68 |
# they are in an unrelated location |
69 |
|
70 |
EXTRA_DYLD_LIBRARY_PATH="" |
71 |
EXTRA_PATH=$ESCRIPT_ROOT/bin |
72 |
EXTRA_PYTHONPATH=$ESCRIPT_ROOT |
73 |
EXTRA_LD_LIBRARY_PATH=$ESCRIPT_ROOT/lib |
74 |
|
75 |
if [ $STANDALONE -eq 1 ] |
76 |
then |
77 |
EXTRA_PATH=$ESCRIPT_PARENT/pkg/python/bin:$ESCRIPT_PARENT/pkg/scons/bin:$EXTRA_PATH |
78 |
EXTRA_LD_LIBRARY_PATH=$ESCRIPT_PARENT/pkg/boost/lib:$ESCRIPT_PARENT/pkg/netcdf/lib/:$EXTRA_LD_LIBRARY_PATH |
79 |
EXTRA_LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH |
80 |
EXTRA_LD_LIBRARY_PATH=$ESCRIPT_PARENT/pkg/python/lib:$EXTRA_LD_LIBRARY_PATH |
81 |
EXTRA_PYTHONPATH=$ESCRIPT_PARENT/pkg/numpy/lib/python2.6/site-packages:$ESCRIPT_PARENT/pkg/matplotlib/lib/python2.6/site-packages:$EXTRA_PYTHONPATH |
82 |
fi |
83 |
|
84 |
|
85 |
BUILDINFO_FILE=$ESCRIPT_ROOT/lib/buildvars |
86 |
if [ ! -r $BUILDINFO_FILE ]; then |
87 |
if [ "$1" = "-e" ];then |
88 |
echo "export LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:\$LD_LIBRARY_PATH" |
89 |
echo "export PYTHONPATH=$EXTRA_PYTHONPATH:\$PYTHONPATH" |
90 |
echo "export PATH=$EXTRA_PATH:\$PATH" |
91 |
if [ "`uname`" = "Darwin" ] |
92 |
then |
93 |
echo "export DYLD_LIBRARY_PATH=$EXTRA_DYLD_LIBRARY_PATH:$EXTRA_LD_LIBRARY_PATH:\$DYLD_LIBRARY_PATH" |
94 |
fi |
95 |
exit 0 |
96 |
fi |
97 |
echo "Error! Unable to read escript build information. Exiting." |
98 |
exit 1 |
99 |
fi |
100 |
|
101 |
function get_buildvar { |
102 |
echo `grep "^$1=" $BUILDINFO_FILE |cut -d= -f2` |
103 |
} |
104 |
|
105 |
# |
106 |
# Add VisIt paths if required |
107 |
# |
108 |
WITH_VISIT=`get_buildvar visit` |
109 |
if [ "$WITH_VISIT" = "1" ]; then |
110 |
VISIT_BIN=`which visit` |
111 |
if [ $? -eq 0 ]; then |
112 |
VISIT_PY_PATH=`$VISIT_BIN -env | grep LIBPATH | cut -d= -f2` |
113 |
EXTRA_PYTHONPATH=$EXTRA_PYTHONPATH:$VISIT_PY_PATH |
114 |
EXTRA_LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:$VISIT_PY_PATH |
115 |
elif [ ! -z $ESCRIPT_VERBOSE ]; then |
116 |
echo "VisIt module enabled but VisIt not in path!" |
117 |
fi |
118 |
fi |
119 |
|
120 |
HELP_TEXT=" |
121 |
Usage: escript [options] script.py [arguments...] |
122 |
-n nn number of nodes to use |
123 |
-p np number of MPI processes to spawn per node |
124 |
-t nt number of OpenMP threads to use |
125 |
-f file name of MPI hostfile |
126 |
-c print compile information for escript and exit |
127 |
-V print escript version and exit |
128 |
-i interactive mode |
129 |
-b do not invoke python (run non-python programs) |
130 |
-e print export statements for environment and exit |
131 |
-o redirect output from MPI to files |
132 |
-v print diagnostics |
133 |
-x ..reserved for future use .. |
134 |
script.py Your python script |
135 |
arguments... The optional command-line arguments to your script |
136 |
" |
137 |
|
138 |
if [ "$1" = "--help" ]; then |
139 |
echo "$HELP_TEXT" |
140 |
exit 0 |
141 |
fi |
142 |
#======================================================================================= |
143 |
|
144 |
# Avoid bug in hybrid runs with MPT MPI |
145 |
|
146 |
|
147 |
# Parse the command-line options |
148 |
# option e should not be followed by a : |
149 |
while getopts 'bn:p:t:f:h:ecVviox' option |
150 |
do |
151 |
case "$option" in |
152 |
"b") DOBINARY=yes |
153 |
;; |
154 |
"n") ESCRIPT_NUM_NODES=$OPTARG |
155 |
;; |
156 |
"p") ESCRIPT_NUM_PROCS=$OPTARG |
157 |
;; |
158 |
"t") ESCRIPT_NUM_THREADS=$OPTARG |
159 |
;; |
160 |
"f") ESCRIPT_HOSTFILE=$OPTARG |
161 |
;; |
162 |
"c") cat $ESCRIPT_ROOT/lib/buildvars |
163 |
exit 0 |
164 |
;; |
165 |
"V") echo "escript-development(build "`get_buildvar svn_revision`")" |
166 |
exit 0 |
167 |
;; |
168 |
"h") echo "$HELPTEXT" |
169 |
exit 0 |
170 |
;; |
171 |
"i") DOINTERACTIVE=yes |
172 |
;; |
173 |
"e") echo "export LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:\$LD_LIBRARY_PATH" |
174 |
echo "export PYTHONPATH=$EXTRA_PYTHONPATH:\$PYTHONPATH" |
175 |
echo "export PATH=$EXTRA_PATH:\$PATH" |
176 |
if [ "`uname`" = "Darwin" ] |
177 |
then |
178 |
echo "export DYLD_LIBRARY_PATH=$EXTRA_DYLD_LIBRARY_PATH:$EXTRA_LD_LIBRARY_PATH:\$DYLD_LIBRARY_PATH" |
179 |
fi |
180 |
exit 0 |
181 |
;; |
182 |
"o") ESCRIPT_CREATESTDFILES="yes" |
183 |
;; |
184 |
"v") ESCRIPT_VERBOSE="yes" |
185 |
;; |
186 |
"x") echo "-x not implemented yet" |
187 |
exit 1 |
188 |
;; |
189 |
?) echo "$HELP_TEXT" |
190 |
exit 1 |
191 |
;; |
192 |
esac |
193 |
done |
194 |
shift `expr $OPTIND - 1` |
195 |
#============================================== |
196 |
# |
197 |
# Read MPI_FLAVOUR and WITH_OPENMP from the buildvars |
198 |
# |
199 |
MPI_FLAVOUR=`get_buildvar mpi` |
200 |
WITH_OPENMP=`get_buildvar openmp` |
201 |
|
202 |
if [ ! -z $ESCRIPT_VERBOSE ]; then |
203 |
echo "MPI flavour is $MPI_FLAVOUR." |
204 |
if [ "$WITH_OPENMP" = "1" ]; then echo "OpenMP enabled."; fi |
205 |
fi |
206 |
|
207 |
# |
208 |
# extend path variables |
209 |
# |
210 |
export PATH=$EXTRA_PATH:$PATH |
211 |
export LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:$LD_LIBRARY_PATH |
212 |
export PYTHONPATH=$EXTRA_PYTHONPATH:$PYTHONPATH |
213 |
EXPORT_ENV="PATH,LD_LIBRARY_PATH,PYTHONPATH" |
214 |
if [ "`uname`" = "Darwin" ] |
215 |
then |
216 |
export DYLD_LIBRARY_PATH=$EXTRA_DYLD_LIBRARY_PATH:$EXTRA_LD_LIBRARY_PATH:$DYLD_LIBRARY_PATH |
217 |
EXPORT_ENV="$EXPORT_ENV,DYLD_LIBRARY_PATH" |
218 |
fi |
219 |
if [ ! -z $ESCRIPT_VERBOSE ] |
220 |
then |
221 |
echo "PATH = $PATH " |
222 |
echo "LD_LIBRARY_PATH = $LD_LIBRARY_PATH " |
223 |
echo "PYTHONPATH = $PYTHONPATH " |
224 |
if [ ! -z $DYLD_LIBRARY_PATH ]; then echo "DYLD_LIBRARY_PATH = $DYLD_LIBRARY_PATH "; fi |
225 |
fi |
226 |
#============================================== |
227 |
# |
228 |
# Ensure the variables have sensible values |
229 |
# |
230 |
if [ "$MPI_FLAVOUR" = "none" ] |
231 |
then |
232 |
if [ ! -z $ESCRIPT_NUM_NODES ] |
233 |
then |
234 |
echo "Warning: MPI disabled but number of nodes set. Option ignored." |
235 |
fi |
236 |
if [ ! -z $ESCRIPT_NUM_PROCS ] |
237 |
then |
238 |
echo "Warning: MPI disabled but number of processors per node set. Option ignored." |
239 |
fi |
240 |
if [ ! -z $ESCRIPT_HOSTFILE ] |
241 |
then |
242 |
echo "Warning: MPI disabled but host file is given. Option ignored." |
243 |
fi |
244 |
ESCRIPT_NUM_NODES=1 |
245 |
ESCRIPT_NUM_PROCS=1 |
246 |
else |
247 |
# use the PBS_NODEFILE if not otherwise specified |
248 |
if [[ ( ! -z $PBS_NODEFILE ) && ( -z $ESCRIPT_HOSTFILE ) ]] |
249 |
then |
250 |
ESCRIPT_HOSTFILE=$PBS_NODEFILE |
251 |
fi |
252 |
|
253 |
if [ ! -z $ESCRIPT_HOSTFILE ] |
254 |
then |
255 |
if [ -f $ESCRIPT_HOSTFILE ] |
256 |
then |
257 |
cat $ESCRIPT_HOSTFILE | sort -u > $HOSTFILE |
258 |
NUM_HOSTS=`cat $HOSTFILE | wc -l` |
259 |
if [ ! -z $ESCRIPT_NUM_NODES ] |
260 |
then |
261 |
if [ $NUM_HOSTS -ne $ESCRIPT_NUM_NODES ] |
262 |
then |
263 |
echo "number of hosts selected in the host file $ESCRIPT_HOSTFILE needs to match the requested number of nodes $ESCRIPT_NUM_NODES." |
264 |
exit 1 |
265 |
fi |
266 |
else |
267 |
ESCRIPT_NUM_NODES=$NUM_HOSTS |
268 |
fi |
269 |
else |
270 |
echo "cannot find hostfile $ESCRIPT_HOSTFILE." |
271 |
exit 1 |
272 |
fi |
273 |
else |
274 |
HOSTFILE='' |
275 |
fi |
276 |
|
277 |
if [ -z $ESCRIPT_NUM_NODES ] |
278 |
then |
279 |
ESCRIPT_NUM_NODES=1 |
280 |
fi |
281 |
|
282 |
if [ -z $ESCRIPT_NUM_PROCS ] |
283 |
then |
284 |
ESCRIPT_NUM_PROCS=1 |
285 |
fi |
286 |
|
287 |
if [ ! -z $ESCRIPT_VERBOSE ] |
288 |
then |
289 |
echo "ESCRIPT_NUM_NODES = $ESCRIPT_NUM_NODES " |
290 |
echo "ESCRIPT_NUM_PROCS = $ESCRIPT_NUM_PROCS " |
291 |
fi |
292 |
fi |
293 |
|
294 |
if [ "$WITH_OPENMP" = "1" ] |
295 |
then |
296 |
if [ -z $ESCRIPT_NUM_THREADS ] |
297 |
then |
298 |
ESCRIPT_NUM_THREADS=$OMP_NUM_THREADS |
299 |
if [ -z $ESCRIPT_NUM_THREADS ] |
300 |
then |
301 |
ESCRIPT_NUM_THREADS=1 |
302 |
fi |
303 |
fi |
304 |
if [ ! -z $ESCRIPT_VERBOSE ] |
305 |
then |
306 |
echo "ESCRIPT_NUM_THREADS is $ESCRIPT_NUM_THREADS." |
307 |
fi |
308 |
else |
309 |
if [[ ( ! -z $ESCRIPT_NUM_THREADS ) && ( $ESCRIPT_NUM_THREADS != 1 ) ]] |
310 |
then |
311 |
echo "Warning: OpenMP is disabled but number of threads requested is $ESCRIPT_NUM_THREADS!=1. Running without threads." |
312 |
fi |
313 |
ESCRIPT_NUM_THREADS=1 |
314 |
fi |
315 |
# |
316 |
# Now we compute total number of Processes |
317 |
# |
318 |
(( TOTPROC=$ESCRIPT_NUM_NODES * $ESCRIPT_NUM_PROCS)) |
319 |
if [ $? -ne 0 ] #Some compute error |
320 |
then #This could happen if the args were not a number |
321 |
echo "expression of total number of processors = $ESCRIPT_NUM_NODES * $ESCRIPT_NUM_PROCS is not numerical." |
322 |
exit 1 |
323 |
fi |
324 |
|
325 |
# |
326 |
# Test to ensure people aren't trying to combine interactive and multi-process |
327 |
# |
328 |
if [[ ( ( ! -z $DOINTERACTIVE ) || ( $# -eq 0 ) ) && ( $TOTPROC -gt 1) ]] |
329 |
then |
330 |
echo "Interactive mode cannot be used with more than one process" |
331 |
exit 1 |
332 |
fi |
333 |
|
334 |
if [ $TOTPROC -gt 1 ] |
335 |
then |
336 |
if [ "$ESCRIPT_CREATESTDFILES" = "yes" ] |
337 |
then |
338 |
PYTHON_MPI=$PYTHON_MPI_REDIRECT |
339 |
else |
340 |
PYTHON_MPI=$PYTHON_MPI_NULL |
341 |
fi |
342 |
else |
343 |
PYTHON_MPI=$PYTHON_MPI_NULL |
344 |
fi |
345 |
#========================================================================================================= |
346 |
# Must have at least one command-line arg: the python script |
347 |
if [ $# -eq 0 ] |
348 |
then |
349 |
if [ ! -z $DOBINARY ] |
350 |
then |
351 |
echo "No program to run was specified. Exiting." |
352 |
exit 1 |
353 |
else |
354 |
DOINTERACTIVE="yes" |
355 |
fi |
356 |
fi |
357 |
|
358 |
#========================================================================================================= |
359 |
if [ ! -z $DOBINARY ] |
360 |
then |
361 |
EXEC_CMD="$@" |
362 |
else |
363 |
# Check to see if the python version we were compiled with matches the |
364 |
# one of PYTHON_CMD. |
365 |
compversion=`get_buildvar python_version | cut -d. -f1,2` |
366 |
intversion=`$PYTHON_CMD -c 'import sys;print "%d.%d"%(sys.version_info[0], sys.version_info[1])'` |
367 |
if [ "$compversion" != "$intversion" ] |
368 |
then |
369 |
echo "Python versions do not match. Escript was compiled for "$compversion"." |
370 |
echo "Current version of Python appears to be "$intversion"." |
371 |
exit 1 |
372 |
fi |
373 |
if [ "$MPI_FLAVOUR" = "none" ] |
374 |
then |
375 |
if [ ! -z $DOINTERACTIVE ] |
376 |
then |
377 |
EXEC_CMD="$PYTHON_CMD -i $@" |
378 |
else |
379 |
EXEC_CMD="$PYTHON_CMD $@" |
380 |
fi |
381 |
else |
382 |
if [ ! -z $DOINTERACTIVE ] |
383 |
then |
384 |
EXEC_CMD="$PYTHON_MPI -i $@" |
385 |
else |
386 |
EXEC_CMD="$PYTHON_MPI $@" |
387 |
fi |
388 |
fi |
389 |
fi |
390 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "Command to be executed is \"$EXEC_CMD\"."; fi |
391 |
#=============================================================================================== |
392 |
# |
393 |
# now we start to spwan things: |
394 |
# |
395 |
if [ "$WITH_OPENMP" = "1" ] |
396 |
then |
397 |
export OMP_NUM_THREADS=$ESCRIPT_NUM_THREADS |
398 |
EXPORT_ENV="$EXPORT_ENV,OMP_NUM_THREADS" |
399 |
fi |
400 |
EXIT_CODE=1 |
401 |
#=============== no MPI =================================== |
402 |
if [ "$MPI_FLAVOUR" = "none" ] |
403 |
then |
404 |
$EXEC_CMD |
405 |
EXIT_CODE=$? |
406 |
#=============== OpenMPI =================================== |
407 |
elif [ "$MPI_FLAVOUR" = "OPENMPI" ] |
408 |
then |
409 |
if [ ! -z $HOSTFILE ] |
410 |
then |
411 |
HOST_LIST=`awk 'BEGIN{S=""}{if (S == "") { S = $0 } else {S = S "," $0}}END{print S}' $HOSTFILE` |
412 |
CMD="mpirun --gmca mpi_warn_on_fork 0 -x ${EXPORT_ENV//,/ -x } --bynode -np $TOTPROC --host $HOST_LIST $EXEC_CMD" |
413 |
else |
414 |
CMD="mpirun --gmca mpi_warn_on_fork 0 -x ${EXPORT_ENV//,/ -x } -np $TOTPROC $EXEC_CMD" |
415 |
fi |
416 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi |
417 |
$CMD |
418 |
EXIT_CODE=$? |
419 |
|
420 |
#=============== Intel MPI =================================== |
421 |
elif [ "$MPI_FLAVOUR" = "INTELMPI" ] |
422 |
then |
423 |
|
424 |
if [ "$WITH_OPENMP" = "1" ] |
425 |
then |
426 |
export I_MPI_PIN_DOMAIN=omp |
427 |
EXPORT_ENV="$EXPORT_ENV, I_MPI_PIN_DOMAIN" |
428 |
fi |
429 |
|
430 |
if [ ! -z $HOSTFILE ] |
431 |
then |
432 |
mpdboot -n $ESCRIPT_NUM_NODES -r ssh -f $HOSTFILE |
433 |
if [ $? -ne 0 ] |
434 |
then |
435 |
echo "mpdboot with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes failed." |
436 |
exit 1 |
437 |
else |
438 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes."; fi |
439 |
fi |
440 |
else |
441 |
mpdboot -n 1 -r ssh |
442 |
if [ $? -ne 0 ] |
443 |
then |
444 |
echo "mpdboot failed." |
445 |
exit 1 |
446 |
else |
447 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started."; fi |
448 |
fi |
449 |
fi |
450 |
CMD="mpiexec -perhost $ESCRIPT_NUM_PROCS -envall -n $TOTPROC $EXEC_CMD" |
451 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi |
452 |
$CMD |
453 |
EXIT_CODE=$? |
454 |
mpdallexit |
455 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdallexit executed."; fi |
456 |
#=============== SGI's MPIMPT =================================== |
457 |
elif [ "$MPI_FLAVOUR" = "MPT" ] |
458 |
then |
459 |
export MPI_NUM_MEMORY_REGIONS=0 |
460 |
EXPORT_ENV="$EXPORT_ENV,MPI_NUM_MEMORY_REGIONS" |
461 |
if [ ! -z $HOSTFILE ] |
462 |
then |
463 |
HOST_LIST=`awk 'BEGIN{S=""}{if (S == "") { S = $0 } else {S = S "," $0}}END{print S}' $HOSTFILE` |
464 |
CMD="mpirun $HOST_LIST -np $ESCRIPT_NUM_PROCS $EXEC_CMD" |
465 |
else |
466 |
CMD="mpirun -np $TOTPROC $EXEC_CMD" |
467 |
fi |
468 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi |
469 |
$CMD |
470 |
EXIT_CODE=$? |
471 |
#=============== MPICH =================================== |
472 |
elif [ "$MPI_FLAVOUR" = "MPICH" ] |
473 |
then |
474 |
if [ ! -z $HOSTFILE ] |
475 |
then |
476 |
touch $HOSTFILE2 |
477 |
for (( i=1;i<=$ESCRIPT_NUM_PROCS;i+=1 )) ; do cat $HOSTFILE >> $HOSTFILE2 ; done |
478 |
CMD="mpirun -machinefile $HOSTFILE2 -np $TOTPROC $EXEC_CMD" |
479 |
else |
480 |
CMD="mpirun -np $TOTPROC $EXEC_CMD" |
481 |
fi |
482 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi |
483 |
$CMD |
484 |
EXIT_CODE=$? |
485 |
#=============== MPICH2 =================================== |
486 |
elif [ "$MPI_FLAVOUR" = "MPICH2" ] |
487 |
then |
488 |
if [ ! -z $HOSTFILE ] |
489 |
then |
490 |
mpdboot -n $ESCRIPT_NUM_NODES -r ssh -f $HOSTFILE |
491 |
if [ $? -ne 0 ] |
492 |
then |
493 |
echo "mpdboot with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes failed." |
494 |
exit 1 |
495 |
else |
496 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes."; fi |
497 |
fi |
498 |
else |
499 |
mpdboot -n 1 -r ssh |
500 |
if [ $? -ne 0 ] |
501 |
then |
502 |
echo "mpdboot failed." |
503 |
exit 1 |
504 |
else |
505 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started."; fi |
506 |
fi |
507 |
fi |
508 |
CMD="mpiexec -genvlist $EXPORT_ENV -np $TOTPROC $EXEC_CMD" |
509 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi |
510 |
$CMD |
511 |
EXIT_CODE=$? |
512 |
mpdallexit |
513 |
if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdallexit executed."; fi |
514 |
else |
515 |
echo "unknown MPI flavour '$MPI_FLAVOUR'." |
516 |
fi |
517 |
exit $EXIT_CODE |