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