2015-10-27 9 views
1

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

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

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: nodes with different numbers of cores), но мой отличается, так как Я должен запускать ровно M потоков в процессе MPI (думаю, гибридный MPI + OpenMP).

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

ответ

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 для открытого MPI.

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

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

или

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

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

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

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

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