Кластер - это группа узлов, каждый узел - это независимый компьютер (группа процессоров и некоторые графические процессоры или другие ускорители), затем узлы соединяются сетью (стоит отметить, что адреса памяти обычно глобальны всуперкомпьютеры).Тогда у вас есть два типа суперкомпьютера: разделяемая память и распределенная память.
Стоит немного прочитать об архитектуре суперкомпьютера ... Википедия - хорошая отправная точка!
Процесс - это независимая рабочая единица.процесс не разделяет память, им нужен способ доступа к памяти друг друга, для этого вы используете библиотеку, такую как MPI.
В slurm процесс называется задачей ...
Чтобы установить количество задач (фактически процессов), вы используете -ntasks или просто -n. Затем вы можете установить количество задач на узел или номер узла.Это две разные вещи!
- ntasks-per-node дает вам количество задач на узел - nodes дает минимальное количество узлов, которое вы хотите.Если вы укажете --nodes = 2, это будет означать, что у вас будет минимум 2 узла, но может быть и больше ... если ваши узлы имеют 18 ядер, и вы запрашиваете 40 задач, то вам нужно как минимум 3 узла ...Вот почему следует избегать использования --nodes (кроме случаев, когда вы знаете, что делаете!)
Тогда определенное количество ЦП (ядер вашего процессора) может быть выделено для одной задачи.это устанавливается с помощью --cpu-per-task.
Один ранг MPI - это одна задача.Тогда задача может запустить несколько потоков.Если вы установите --cpu-per-task на один, все эти потоки будут работать на одном ядре.И поэтому соревнуйтесь за ресурс.Обычно вы хотите иметь один поток на ядро (или 2, если вы используете гиперпоточность).
Когда вы устанавливаете --cpu-per-task, оно ДОЛЖНО быть меньшим числом ядер на узел, поскольку задача может выполняться только на одном узле!(в системе с распределенной памятью).
Подводя итог:
Итак, если вы хотите запустить M mpi-процессы, которые будут запускать по N потоков каждый.Сначала N должно быть меньше числа ядер на узел, лучше быть целочисленным делителем количества ядер на узел (в противном случае вы ограничите некоторые ядра).
Вы установите: --ntasks = "M "--cpus-per-task =" N "
Затем вы запустите с помощью: srun ./your_hybrid_app
Тогда не забудьте 2 вещи: Если вы используете OpenMP: Установите числопотока:
export OMP_NUM_THREADS = "N"
и не забудьте правильно инициализировать MPI для многопоточности ...
!/bin/bash -l
#
#SBATCH --account=myAccount
#SBATCH --job-name="a job"
#SBATCH --time=24:00:00
#SBATCH --ntasks=16
#SBATCH --cpus-per-task=4
#SBATCH --output=%j.o
#SBATCH --error=%j.e
export OMP_NUM_THREADS=4
srun ./your_hybrid_app
Это запустит 16 задач с 4ядер на задачу (и 4 потока OMP на задачу, поэтому по одному на ядро).