Проект

Общее

Профиль

Mpi usecases » История » Версия 1

Владимир Кихтенко, 16.03.2012 17:32

1 1 Владимир Кихтенко
h1. MPI примеры
2
3
h2. Запуск MPI процесса на каждые n ядер
4
5
Иногда нужно запустить mpi процессы так, чтобы у каждого процесса в распоряжении оказалось n ядер. По умолчанию mpiexec запускает по одному процессу на каждое ядро выделенное планировщиком. Для того чтобы добиться требуемого поведения рекомендуется использовать следующую конструкцию в скрипте запуска:
6
<pre><code class="bash">
7
#!/bin/bash
8
9
module purge
10
module load openmpi/pgi
11
12
cpus_per_proc=2
13
node_count=()
14
node_list=""
15
tasks=$(($PBS_NP/$cpus_per_proc))
16
actual_tasks=0
17
18
echo "Trying to run $tasks mpi tasks, $cpus_per_proc cores per task" >&2
19
20
if [ $PBS_NP -ne $(($tasks * $cpus_per_proc)) ] ; then
21
    echo "Warning! Some cores will not be used. Consider better resource request." >&2
22
fi
23
24
for node in `cat $PBS_NODEFILE` ; do
25
    if [ -z ${node_count[$node]} ] ; then
26
        node_count[$node]=0
27
    fi
28
    node_count[$node]=$(( ${node_count[$node]} + 1 ))
29
    if [ ${node_count[$node]} -eq $cpus_per_proc ] ; then
30
        node_list=${node_list}${node}" "
31
        node_count[$node]=0
32
        actual_tasks=$(($actual_tasks+1))   
33
    fi
34
done
35
36
if [ $actual_tasks -ne $tasks ] ; then
37
    echo "Can't find enough nodes!" >&2
38
    echo "Only $actual_tasks mpi tasks can be run on current allocation." >&2
39
    echo "List of allocated nodes:" >&2
40
    cat $PBS_NODEFILE >&2
41
    exit 13
42
fi
43
44
echo "Will run $tasks mpi processes on nodes: $node_list" >&2
45
mpiexec -np $tasks --cpus-per-proc $cpus_per_proc -nooversubscribe $PBS_O_WORKDIR/test
46
</code></pre>
47
Ключевым моментом является использование опции @--cpus-per-proc@. Кроме того данный скрипт проверяет, что выделенные узлы подходят для запуска такой задачи.