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@. Кроме того данный скрипт проверяет, что выделенные узлы подходят для запуска такой задачи. |