MPI примеры

Запуск MPI процесса на каждые n ядер

Иногда нужно запустить mpi процессы так, чтобы у каждого процесса в распоряжении оказалось n ядер. По умолчанию mpiexec запускает по одному процессу на каждое ядро выделенное планировщиком. Для того чтобы добиться требуемого поведения рекомендуется использовать следующую конструкцию в скрипте запуска:

#!/bin/bash

module purge
module load openmpi/pgi

cpus_per_proc=2
node_count=()
node_list="" 
tasks=$(($PBS_NP/$cpus_per_proc))
actual_tasks=0

echo "Trying to run $tasks mpi tasks, $cpus_per_proc cores per task" >&2

if [ $PBS_NP -ne $(($tasks * $cpus_per_proc)) ] ; then
    echo "Warning! Some cores will not be used. Consider better resource request." >&2
fi

for node in `cat $PBS_NODEFILE` ; do
    if [ -z ${node_count[$node]} ] ; then
        node_count[$node]=0
    fi
    node_count[$node]=$(( ${node_count[$node]} + 1 ))
    if [ ${node_count[$node]} -eq $cpus_per_proc ] ; then
        node_list=${node_list}${node}" " 
        node_count[$node]=0
        actual_tasks=$(($actual_tasks+1))   
    fi
done

if [ $actual_tasks -ne $tasks ] ; then
    echo "Can't find enough nodes!" >&2
    echo "Only $actual_tasks mpi tasks can be run on current allocation." >&2
    echo "List of allocated nodes:" >&2
    cat $PBS_NODEFILE >&2
    exit 13
fi

echo "Will run $tasks mpi processes on nodes: $node_list" >&2
mpiexec -np $tasks --cpus-per-proc $cpus_per_proc -nooversubscribe $PBS_O_WORKDIR/test

Ключевым моментом является использование опции --cpus-per-proc. Кроме того данный скрипт проверяет, что выделенные узлы подходят для запуска такой задачи.