Запрос целого числа, кратного M ядер на узел на SGE

Я хочу отправить многопоточное задание MPI в SGE, а кластер, в котором я работаю, имеет разные узлы, каждый из которых имеет разное количество ядер. Допустим, количество потоков на процесс равно M (M == OMP_NUM_THREADS для OpenMP). Как я могу запросить, чтобы задание, отправленное в очередь SGE, выполнялось таким образом, чтобы в каждом узле было выделено целое число, кратное M для моей работы?

Допустим, M=8, а количество задач MPI равно 5 (всего требуется 40 ядер). И в этом кластере есть узлы с 4, 8, 12 и 16 ядрами. Тогда эта комбинация в порядке:

2*(8-core nodes) + 1*(16-core nodes) + 0.5*(16-core nodes)

но, конечно, не любой из этих:

2*(4-core nodes) + 2*(8-core nodes) + 1*(16-core node)
2*(12-core nodes) + 1*(16-core node)
(3/8)*(8-core nodes) + (5/8)*(8-core nodes) + 2*(16-core node)

PS: был еще один похожий вопрос, например этот: ( MPI & pthreads : узлы с разным количеством ядер ), но мой отличается, так как мне нужно запускать ровно M потоков на процесс MPI (подумайте о гибридном MPI + OpenMP).

Лучший сценарий — запускать это задание исключительно на узлах одного типа. Но чтобы ускорить время запуска, я хочу, чтобы это задание выполнялось на разных типах узлов, при условии, что каждый узел имеет целое число * M ядер, выделенных для задания.


person Wirawan Purwanto    schedule 27.10.2015    source источник


Ответы (1)


Политика распределения в SGE определяется для каждой параллельной среды (PE). Каждый PE может быть настроен для заполнения слотов, доступных на узлах кластера, определенным образом. Один запрашивает определенный PE с параметром -pe pe_name num_slots, а затем SGE пытается найти num_slots слотов в соответствии с политикой распределения pe_name PE. К сожалению, нет простого способа запрашивать слоты в целых числах на узел.

Чтобы иметь возможность запрашивать ровно M слота на хост (а не кратное M), ваш администратор SGE (или вы, если вы являетесь администратором SGE) должны сначала создать новый PE, назовем его mpi8ppn, установим его allocation_rule в 8, а затем назначим PE каждой очереди кластера. Затем вы должны отправить задание на этот PE с -pe mpi8ppn 40 и указать среде выполнения MPI запускать только один процесс на хост, например. с -npernode 1 для Open MPI.

Если описанное выше маловероятно, вашим другим (ненадежным) решением будет запросить очень большой объем памяти на слот, близкий к тому, что есть у каждого узла, например. -l h_vmem=23.5G. Если предположить, что узлы настроены на h_vmem из 24 ГиБ, этот запрос гарантирует, что SGE не сможет разместить более одного слота на каждом хосте. Итак, если вы хотите запустить гибридное задание на 5 узлах, вы просто запросите у SGE 5 слотов и 23,5G vmem для каждого слота с помощью:

qsub -pe whatever 5 -l h_vmem=23.5G <other args> jobscript

or

#$ -pe whatever 5
#$ -l h_vmem=23.5G

Этот метод ненадежен, так как не позволяет выбрать узлы кластера, имеющие определенное количество ядер, и работает только в том случае, если все узлы настроены на h_vmem менее 47 ГБ. h_vmem служит здесь только в качестве примера — подойдет любой другой расходуемый атрибут для каждого слота. Следующая команда должна дать вам представление о том, какие хост-комплексы определены и каковы их значения на узлах кластера:

qhost -F | egrep '(^[^ ])|(hc:)'

Этот метод лучше всего работает для кластеров, где node_mem = k * #cores с k постоянными для всех узлов. Если узел предоставляет вдвое больше ядер, но также имеет вдвое больше памяти, например. 48 ГиБ, то указанный выше запрос даст вам два слота на таких узлах.

Я не утверждаю, что полностью понимаю SGE, и мои знания восходят к эпохе SGE 6.2u5, поэтому в настоящее время могут существовать более простые решения.

person Hristo Iliev    schedule 27.10.2015