Пакетный скрипт для LSF, когда только один процесс MPI среди других имеет 2 или более потоков

Моя программа использует 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 получает свой собственный узел.

Другие вопросы по тегам