#!/bin/sh # BEGIN_ICS_COPYRIGHT8 **************************************** # # Copyright (c) 2015, Intel Corporation # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Intel Corporation nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # END_ICS_COPYRIGHT8 **************************************** # [ICS VERSION STRING: unknown] # helper script to handle common setup for the sample application run scripts # this script should be . included in a run_ script # Input: # MPICH_PREFIX - path to MPICH tools # MPI_HOSTS - mpi_hosts file to use (default is $PWD/mpi_hosts) # MPI_TASKSET - arguments to /bin/taskset to control CPU selection # default is to not use /bin/taskset # may be set in environment or param file # SHOW_MPI_HOSTS - set to "y" if MPI_HOSTS contents should be output prior # to starting job. Set to "n" to disable # defaults to "y" # SHOW_MPI_HOSTS_LINES - maximum lines in MPI_HOSTS to show. Default is 128 # Only lines applicable to job will be shown. # Note the file might include some comment lines # NUM_PROCESSES - number of processes in job, if "" no count is specified # if "all" use wc -l $MPI_HOSTS as the process count # MIN_PROCESSES - minimum number of processes in job (default of 2) # MULT_PROCESSES - NUM_PROCESSES must be a multiple of this (default of 1) # PARAM_FILE - Native IB param file to use, if "" no param file is specified # APP - application name for use a prefix to LOGFILE name # LOGFILE - logfile to append results of run to, if "" this script will define # LOGSUFFIX - suffix to append to logfile name defined by this script # Output: # MPI_RUN_CMD - MPI command to start job, actual program name and args can be suffixed # LOGFILE - logfile to append results of run to . ./select_mpi # default MPICH_PREFIX if necessary # helper function which can be called by each run_* script to output the # list of hosts the job is run for. By default the output is enabled. # This can be especially useful when running many small # batch jobs, such as cabletest, so that errors in the log can more easily # be associated to the list of hosts included in the run show_mpi_hosts() { local lines echo "Using hosts list: $MPI_HOSTS" if [ "${SHOW_MPI_HOSTS:-y}" = "y" ] then show_lines=${SHOW_MPI_HOSTS_LINES:-128} if [ "z$NUM_PROCESSES" != "z" ] then # there may be comments before the last host. So we number the # lines, filter out the lines with comments and blank lines # and then get the "NUM_PROCESSES"th line's number avail_lines=$(nl -s';' -nln -w1 -ba $MPI_HOSTS|egrep -v '^[0-9]*;[[:space:]]*#'|egrep -v '^[0-9]*;[[:space:]]*$'|head -$NUM_PROCESSES|tail -1|cut -f1 -d';' ) else # no NUM_PROCESSES, so use whole file avail_lines=$(cat $MPI_HOSTS|wc -l) fi if [ $show_lines -ge $avail_lines ] then echo "Hosts in run:" head -n $avail_lines $MPI_HOSTS else echo "First $show_lines lines in host list for run:" head -n $show_lines $MPI_HOSTS fi echo fi } MPI_HOSTS=${MPI_HOSTS:-$PWD/mpi_hosts} if [ $(echo $MPI_HOSTS|cut -c1) != '/' ] then MPI_HOSTS="$PWD/$MPI_HOSTS" fi MIN_PROCESSES=${MIN_PROCESSES:-2} MULT_PROCESSES=${MULT_PROCESSES:-1} if [ z"$NUM_PROCESSES" = zall ] then # skip comment and blank lines NUM_PROCESSES=$(cat $MPI_HOSTS|egrep -v '^[[:space:]]*#'|egrep -v '^[[:space:]]*$'|wc -l) fi if [ z"$NUM_PROCESSES" != z ] then if ! [ $NUM_PROCESSES -ge $MIN_PROCESSES ] 2>/dev/null then echo " Invalid process count: $NUM_PROCESSES" echo " This application requires a minimum of $MIN_PROCESSES processes" exit 2 fi if [ $(($NUM_PROCESSES % $MULT_PROCESSES)) -ne 0 ] then echo " Invalid process count: $NUM_PROCESSES" echo " This application requires a multiple of $MULT_PROCESSES processes" exit 2 fi fi if [ ! -f $MPI_HOSTS ] then echo " Please create $MPI_HOSTS file with the list of " echo " processors in this cluster. One hostname per line." echo " See mpi_hosts.sample file" exit 1 fi if [ -z "$LOGFILE" ] then CURTIME=`date +%d%b%y%H%M%S` if [ ! -d logs ] then mkdir -p logs fi LOGFILE=$PWD/logs/$APP.$CURTIME$LOGSUFFIX echo " Running MPI tests with $NUM_PROCESSES processes" echo " logfile $LOGFILE" > $LOGFILE fi # additional arguments can be specified on mpirun command line MPI_CMD_ARGS= disable_affinity= USING_MPD=n #I think we can delete this variable # Determine which MPI is being used: if [ -e "$MPICH_PREFIX/bin/tune" ] #IntelMPI then echo "IntelMPI Detected, running with mpirun." | tee -i -a $LOGFILE if [ -e ./intelmpi.params ] then . ./intelmpi.params fi MPI_RUN_CMD="$MPICH_PREFIX/bin/mpirun ${NUM_PROCESSES:+-np $NUM_PROCESSES} -hostfile $MPI_HOSTS $MPI_CMD_ARGS " elif [ -e "$MPICH_PREFIX/bin/ompi_info" ] #OpenMPI then echo "OpenMPI Detected, running with mpirun." | tee -i -a $LOGFILE MPI_CMD_ARGS="-mca plm_rsh_no_tree_spawn 1" if [ -e ./openmpi.params ] then . ./openmpi.params fi MPI_RUN_CMD="$MPICH_PREFIX/bin/mpirun ${NUM_PROCESSES:+-np $NUM_PROCESSES} -map-by node --allow-run-as-root -machinefile $MPI_HOSTS $MPI_CMD_ARGS " elif [ -e "$MPICH_PREFIX/bin/mpichversion" ] #Mvapich2 then echo "MVAPICH2 Detected, running with mpirun." | tee -i -a $LOGFILE if [ -e ./mvapich2.params ] then . ./mvapich2.params fi disable_affinity="-genv MV2_ENABLE_AFFINITY 0" MPI_RUN_CMD="$MPICH_PREFIX/bin/mpirun -machinefile $MPI_HOSTS ${NUM_PROCESSES:+-n $NUM_PROCESSES} $MPI_CMD_ARGS " else echo "MPI Not Recognized!i exiting" | tee -i -a $LOGFILE exit 1 fi head -n $NUM_PROCESSES $MPI_HOSTS|sort -u > ff.hosts # add /bin/taskset to MPI_RUN_CMD based on MPI_TASKSET value if [ x"$MPI_TASKSET" != x ] then if [ -x /bin/taskset ] then MPI_RUN_CMD="$MPI_RUN_CMD $disable_affinity /bin/taskset $MPI_TASKSET " elif [ -x /usr/bin/taskset ] then MPI_RUN_CMD="$MPI_RUN_CMD $disable_affinity /usr/bin/taskset $MPI_TASKSET " fi fi