Моя программа использует MPI + pthreads, где n-1 MPI-процессы являются чистым кодом MPI, тогда как единственный процесс MPI использует pthreads. Последний процесс содержит всего 2 потока (основной поток и pthread). Предположим, что кластер HPC, на котором я хочу запустить эту программу, состоит из вычислительных узлов, каждый из которых имеет 12 ядер. Как мне написать пакетный сценарий, чтобы максимально использовать оборудование?
Ниже приведен мой пакетный сценарий, который я написал. Я использую экспорт OMP_NUM_THREADS = 2, потому что последний процесс MPI имеет 2 потока и должен предполагать, что у других также есть 2 потока.
Затем я выделяю 6 процессов MPI на узел, поэтому каждый узел может запускать 6xOMP_NUM_THREADS = 12 (= количество ядер на каждом узле) потоков, несмотря на то, что все процессы MPI, кроме одного, имеют 1 поток.
#BSUB -J LOOP.N200.L1000_SIMPLE_THREAD
#BSUB -o LOOP.%J
#BSUB -W 00:10
#BSUB -M 1024
#BSUB -N
#BSUB -a openmpi
#BSUB -n 20
#BSUB -m xxx
#BSUB -R "span[ptile=6]"
#BSUB -x
export OMP_NUM_THREADS=2
Как мне написать лучший сценарий для этого?
2 ответа
Следующее должно работать, если вы хотите, чтобы последний ранг был гибридным:
#BSUB -n 20
#BSUB -R "span[ptile=12]"
#BSUB -x
$MPIEXEC $FLAGS_MPI_BATCH -n 19 -x OMP_NUM_THREADS=1 ./program : \
$FLAGS_MPI_BATCH -n 1 -x OMP_NUM_THREADS=2 ./program
Если вы хотите, чтобы ранг 0 был гибридным, просто переключите две строки:
$MPIEXEC $FLAGS_MPI_BATCH -n 1 -x OMP_NUM_THREADS=2 ./program : \
$FLAGS_MPI_BATCH -n 19 -x OMP_NUM_THREADS=1 ./program
Это использует возможность Open MPI для запуска программ MIMD.
Вы упоминаете, что в вашем гибридном ранге используются потоки POSIX, но при этом вы устанавливаете переменную среды, связанную с OpenMP. Если вы на самом деле не используете OpenMP, вам вообще не нужно устанавливать OMP_NUM_THREADS
, и этой простой команды mpiexec
должно хватить:
$MPIEXEC $FLAGS_MPI_BATCH ./program
(на случай, если мое предположение об учебном заведении, в котором вы учитесь или работаете, окажется неверным, удалите $FLAGS_MPI_BATCH
и замените $MPIEXEC
на mpiexec
)
Прошло некоторое время с тех пор, как я использовал LSF, так что это может быть не совсем правильно, поэтому вам следует поэкспериментировать.
Я прочитал ваш запрос
#BSUB -n 20
#BSUB -R "span[ptile=6]"
Как, всего 20 задач, по 6 задач на узел. Это означает, что вы получите 4 узла. Что кажется пустой тратой, поскольку вы заявили, что каждый узел имеет 12 ядер.
Как насчет использования всех ядер на узлах, поскольку вы запросили эксклюзивные хосты (-x
)
#BSUB -x
#BSUB -n 20
#BSUB -R "span[ptile=12]"
export OMP_NUM_THREADS=2
Таким образом, вы знаете ранг
- 0..11 находится на первом хосте
- 12..19 находится на втором хосте
Где у второго хоста есть свободные слоты, чтобы использовать OpenMP ранга 19.
Конечно, если вы попадаете на еще более забавную должность, LSF позволяет вам определить место трудоустройства. Используя LSB_PJL_TASK_GEOMETRY
.
Допустим, у вас было 25 задач MPI с рангом 5 с использованием 12 ядер.
#BSUB -x
#BSUB -n 25
#BSUB -R "span[ptile=12]"
export LSB_PJL_TASK_GEOMETRY="{(0,1,2,3,4,6,7,8,9,10,11,12)\
(13,14,15,16,17,18,19,20,21,22,23,24)\
(5)}"
Таким образом, задача 5 получит собственный узел.
-n
указывает количество слотов. В вашем случае каждый вычислительный узел предоставляет 12 слотов, и это соответствует количеству ядер ЦП на узле (но обратите внимание, что слоты не сопоставляются напрямую с ядрами). Каждое задание может использовать свои слоты по своему усмотрению. Грубо говоря, задания MPI запускают один процесс в каждом слоте, а задания OpenMP запускают один поток в каждом слоте.
-n 6 -R "span[ptile=4]" -x
, чтобы получить 6 слотов, иметь 4 процесса MPI на узел и иметь исключительно узлы. Это приведет к следующему распределению: 4x3+2x3
(MPI обрабатывает x потоков). Обратите внимание, что это относится только к потокам, интенсивно использующим ЦП. В кластерах InfiniBand Open MPI порождает два дополнительных потока на каждый процесс. Эти два процессора мало используют ЦП и поэтому могут совместно использовать одно ядро с основным потоком, и вам не нужно запрашивать для них специальные слоты.
Похожие вопросы
Новые вопросы
mpi
MPI - это интерфейс передачи сообщений, библиотека для параллельного программирования с распределенной памятью и де-факто стандартный метод использования кластеров распределенной памяти для высокопроизводительных технических вычислений. Вопросы об использовании MPI для параллельного программирования находятся под этим тегом; вопросы, например, о проблемах установки с реализациями MPI, лучше всего помечать соответствующими тегами, специфичными для реализации, например, MPICH или OpenMPI.