- Update to version 1.2. - Refresh patch * prun-Add-user-config.patch - License change, from SD-3-Clause to Apache-2.0. - Use %license OBS-URL: https://build.opensuse.org/request/show/728498 OBS-URL: https://build.opensuse.org/package/show/network:cluster:ohpc/prun-ohpc?expand=0&rev=8
269 lines
5.7 KiB
Bash
269 lines
5.7 KiB
Bash
#!/bin/bash
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
CONFIG=/etc/sysconfig/prun
|
|
MODE=native
|
|
LOGLEVEL=2 # 0=error,1=warn,2=info,3=debug
|
|
|
|
function usage () {
|
|
|
|
echo " "
|
|
echo "This OpenHPC utility is used to launch parallel (MPI) applications"
|
|
echo "within a supported resource manager."
|
|
echo " "
|
|
echo "Usage: $DELIM <options> executable [arguments]"
|
|
echo " "
|
|
echo "where available options are as follows:"
|
|
echo " "
|
|
echo " -h generate help message and exit"
|
|
echo " -v enable verbose output"
|
|
echo " "
|
|
exit 1
|
|
}
|
|
|
|
function parse_config_file () {
|
|
|
|
if [ -e $CONFIG ];then
|
|
source $CONFIG 2> /dev/null
|
|
fi
|
|
}
|
|
|
|
function _error () {
|
|
if [ $LOGLEVEL -ge 0 ];then
|
|
echo -n "[$DELIM] Error: "
|
|
echo "$@"
|
|
fi
|
|
}
|
|
|
|
function _warn () {
|
|
if [ $LOGLEVEL -ge 1 ];then
|
|
echo -n "[$DELIM] "
|
|
echo "$@"
|
|
fi
|
|
}
|
|
|
|
function _info () {
|
|
if [ $LOGLEVEL -ge 2 ];then
|
|
echo -n "[$DELIM] "
|
|
echo "$@"
|
|
fi
|
|
}
|
|
|
|
function _debug () {
|
|
if [ $LOGLEVEL -ge 3 ];then
|
|
echo -n "[$DELIM] "
|
|
echo "$@"
|
|
fi
|
|
}
|
|
|
|
function verify_launcher_avail () {
|
|
if [ ! $(type -P "$1") ];then
|
|
_error "Expected Job launcher $1 not found for $LMOD_FAMILY_MPI"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function set_variable () {
|
|
|
|
local var=$1
|
|
local set=$2
|
|
|
|
_debug "Setting env variable: $var=$2"
|
|
export $var="$2"
|
|
}
|
|
|
|
function launch_impi () {
|
|
if [ $MODE == "native" ];then
|
|
LAUNCHER="mpiexec.hydra"
|
|
verify_launcher_avail $LAUNCHER
|
|
|
|
if [ ${RM} == "slurm" ];then
|
|
cmd="$LAUNCHER -bootstrap slurm $@"
|
|
elif [ ${RM} == "pbspro" ];then
|
|
cmd="$LAUNCHER -rmk pbs $@"
|
|
fi
|
|
|
|
_info "Launch cmd = $cmd (family=$LMOD_FAMILY_MPI)"
|
|
$cmd
|
|
fi
|
|
}
|
|
|
|
function launch_mpich () {
|
|
|
|
if [[ ${RM} == "slurm" ]];then
|
|
if [[ ${OHPC_MPI_LAUNCHERS} =~ "pmix" ]];then
|
|
verify_launcher_avail srun
|
|
cmd="srun --mpi=pmix $@"
|
|
else
|
|
verify_launcher_avail mpiexec.hydra
|
|
cmd="mpiexec.hydra -bootstrap slurm $@"
|
|
fi
|
|
elif [[ ${RM} == "pbspro" ]];then
|
|
verify_launcher_avail mpiexec.hydra
|
|
cmd="mpiexec.hydra -rmk pbs $@"
|
|
else
|
|
_error "Unknown resource manager -> ${RM}"
|
|
fi
|
|
|
|
_info "Launch cmd = $cmd (family=$LMOD_FAMILY_MPI)"
|
|
$cmd
|
|
|
|
return $?
|
|
}
|
|
|
|
function launch_mvapich2 () {
|
|
if [ $MODE == "native" ];then
|
|
|
|
LAUNCHER="mpiexec.hydra"
|
|
verify_launcher_avail $LAUNCHER
|
|
|
|
if [ ${RM} == "slurm" ];then
|
|
cmd="$LAUNCHER -bootstrap slurm $@"
|
|
elif [ ${RM} == "pbspro" ];then
|
|
cmd="$LAUNCHER -rmk pbs $@"
|
|
else
|
|
_error "Unknown resource manager -> ${RM}"
|
|
fi
|
|
|
|
_info "Launch cmd = $cmd (family=$LMOD_FAMILY_MPI)"
|
|
$cmd
|
|
|
|
local _status=$?
|
|
|
|
return $_status
|
|
fi
|
|
}
|
|
|
|
function setupenv_openmpi () {
|
|
# disable plugin loader warnings if not not available
|
|
set_variable OMPI_MCA_mca_base_component_show_load_errors 0
|
|
set_variable PMIX_MCA_mca_base_component_show_load_errors 0
|
|
|
|
# no tm module avail when using slurm
|
|
if [[ ${RM} == "slurm" ]];then
|
|
set_variable OMPI_MCA_ras ^tm
|
|
set_variable OMPI_MCA_ess ^tm
|
|
set_variable OMPI_MCA_plm ^tm
|
|
fi
|
|
|
|
# use romio for openmpi3
|
|
if [[ $LMOD_FAMILY_MPI == "openmpi3" ]];then
|
|
set_variable OMPI_MCA_io romio314
|
|
fi
|
|
}
|
|
|
|
function launch_openmpi () {
|
|
|
|
setupenv_openmpi
|
|
|
|
if [[ ${RM} == "slurm" ]];then
|
|
if [[ ${OHPC_MPI_LAUNCHERS} =~ "pmix" ]];then
|
|
verify_launcher_avail srun
|
|
cmd="srun --mpi=pmix $@"
|
|
else
|
|
verify_launcher_avail mpirun
|
|
cmd="mpirun $@"
|
|
fi
|
|
elif [[ ${RM} == "pbspro" ]];then
|
|
verify_launcher_avail mpiexec
|
|
cmd="mpiexec -x LD_LIBRARY_PATH --prefix ${MPI_DIR} --hostfile ${PBS_NODEFILE} $@"
|
|
else
|
|
_error "Unknown resource manager -> ${RM}"
|
|
fi
|
|
|
|
_info "Launch cmd = $cmd (family=$LMOD_FAMILY_MPI)"
|
|
$cmd
|
|
|
|
return $?
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DELIM=prun
|
|
|
|
# Parse command-line args
|
|
|
|
while getopts "hv" opt; do
|
|
case $opt in
|
|
h)
|
|
usage
|
|
;;
|
|
v)
|
|
LOGLEVEL=3
|
|
;;
|
|
\?)
|
|
echo "Invalid option: -$OPTARG" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
shift $((OPTIND-1))
|
|
|
|
if [ $# -lt 1 ];then
|
|
usage
|
|
fi
|
|
|
|
|
|
parse_config_file
|
|
|
|
EXEC=$1
|
|
shift
|
|
ARGS=$@
|
|
|
|
# Resource manager detection. If not specified from the config file, determine
|
|
# from locally installed packages. Like Highlander, we assume there can be only one.
|
|
|
|
if [ -z "$RM" ];then
|
|
[[ -s /etc/pbs.conf ]] && RM=pbspro
|
|
[[ -s /etc/slurm/slurm.conf ]] && RM=slurm
|
|
fi
|
|
|
|
if ! [ -x "$(command -v $EXEC)" ];then
|
|
if [ ! -x $EXEC ];then
|
|
_error "Unable to access executable -> $EXEC"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ -z $LMOD_FAMILY_MPI ];then
|
|
_error "LMOD_FAMILY_MPI environment variable must be set to desired MPI runtime"
|
|
exit 1
|
|
fi
|
|
|
|
masterHost=`hostname -s`
|
|
_info "Master compute host = $masterHost"
|
|
_info "Resource manager = $RM"
|
|
|
|
if [ $LMOD_FAMILY_MPI == "impi" ];then
|
|
launch_impi $EXEC $ARGS
|
|
elif [ $LMOD_FAMILY_MPI == "mpich" ];then
|
|
launch_mpich $EXEC $ARGS
|
|
elif [ $LMOD_FAMILY_MPI == "mvapich2" ];then
|
|
launch_mvapich2 $EXEC $ARGS
|
|
elif [ $LMOD_FAMILY_MPI == "openmpi" ];then
|
|
launch_openmpi $EXEC $ARGS
|
|
elif [ $LMOD_FAMILY_MPI == "openmpi3" ];then
|
|
launch_openmpi $EXEC $ARGS
|
|
else
|
|
_error "Unsupported or unknown MPI family -> $LMOD_FAMILY_MPI"
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|