В зависимости от используемого параллелизма: распределенная или общая память
--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