Кластер HPC: выберите количество процессоров и потоков в пакете SLURM - PullRequest
0 голосов
/ 02 июля 2018

Терминология, используемая в справочной странице sbatch, может быть немного запутанной. Таким образом, я хочу быть уверен, что я правильно установил параметры. Предположим, у меня есть задача для запуска на одном узле с N потоков. Правильно ли предположить, что я буду использовать --nodes=1 и --ntasks=N?

Я привык думать, например, об использовании pthreads для создания N потоков внутри одного процесса. Является ли это результатом того, что они называют «ядрами» или «процессором на задачу»? На мой взгляд, процессоры и потоки - это не одно и то же.

1 Ответ

0 голосов
/ 02 июля 2018

В зависимости от используемого параллелизма: распределенная или общая память

--ntasks=#: Количество «заданий» (используется с распределенным параллелизмом).

--ntasks-per-node=#: Количество «задач» на узел (используется с распределенным параллелизмом).

--cpus-per-task=#: количество процессоров, выделенных для каждой задачи (используется с параллелизмом совместно используемой памяти).


Из этого вопроса : если каждый узел имеет 24 ядра, есть ли разница между этими командами?

sbatch --ntasks 24 [...]
sbatch --ntasks 1 --cpus-per-task 24 [...]

Ответ :

Да, между этими двумя представлениями есть разница. Вы правы, что обычно ntasks для mpi и cpus-per-task для многопоточности , но давайте посмотрим на ваши команды:

Для вашего первого примера sbatch --ntasks 24 […] выделит работу с 24 задачами. Этими задачами в данном случае являются только 1 ЦП, но они могут быть разделены на несколько узлов. Таким образом, вы получаете в общей сложности 24 ЦП на нескольких узлах.

Для вашего второго примера sbatch --ntasks 1 --cpus-per-task 24 [...] выделит задание с 1 задачей и 24 процессорами для этой задачи. Таким образом, вы получите 24 процессора на одном узле.

Другими словами, задача не может быть разделена на несколько узлов. Следовательно, использование --cpus-per-task обеспечит его выделение для одного и того же узла, а использование --ntasks может и может выделить его для нескольких узлов.


Еще один хороший вопрос и ответ : предположим, вам нужно 16 ядер. Вот несколько вариантов использования

  • вы используете mpi и не заботитесь о том, где эти ядра распределены: --ntasks=16
  • вы хотите запустить 16 независимых процессов (без связи): --ntasks=16
  • вы хотите, чтобы эти ядра распределялись по разным узлам: --ntasks=16 and --ntasks-per-node=1 или --ntasks=16 and --nodes=16
  • вы хотите, чтобы эти ядра распределялись по отдельным узлам и не мешали другим работам: --ntasks=16 --nodes=16 --exclusive
  • вы хотите, чтобы 16 процессов распределялись по 8 узлам, чтобы иметь по два процесса на узел: --ntasks=16 --ntasks-per-node=2
  • вы хотите, чтобы 16 процессов оставались на одном узле: --ntasks=16 --ntasks-per-node=16
  • вам нужен один процесс, который может использовать 16 ядер для многопоточности: --ntasks=1 --cpus-per-task=16
  • вам нужно 4 процесса, которые могут использовать 4 ядра для многопоточности: --ntasks=4 --cpus-per-task=4
...