Основные вопросы по слёрму - PullRequest
0 голосов
/ 23 февраля 2019

Я использую кластер для тяжелых вычислений.Есть несколько вещей, которые я не понимаю.Например, я использовал эту конфигурацию для всей своей работы до сих пор

#SBATCH -J ss      
#SBATCH -N 1         # allocate 1 nodes for the job
#SBATCH -n 15        # 20 tasks total
#SBATCH -t 12:0:0    
#SBATCH --mem=12000 

Однако я не знаю, является ли узел компьютером (-N 1) и что такое задача (-n 15).

Мои коды MPI, но в идеале я хочу сделать гибрид MPI и OpenMP.Как мне настроить мой SBATCH для этого?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Кластер - это группа узлов, каждый узел - это независимый компьютер (группа процессоров и некоторые графические процессоры или другие ускорители), затем узлы соединяются сетью (стоит отметить, что адреса памяти обычно глобальны всуперкомпьютеры).Тогда у вас есть два типа суперкомпьютера: разделяемая память и распределенная память.

Стоит немного прочитать об архитектуре суперкомпьютера ... Википедия - хорошая отправная точка!

Процесс - это независимая рабочая единица.процесс не разделяет память, им нужен способ доступа к памяти друг друга, для этого вы используете библиотеку, такую ​​как 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 на задачу, поэтому по одному на ядро).

0 голосов
/ 23 февраля 2019

Узел - это компьютер, а задачей является каждый двоичный файл, который загружается в память (в MPI, несколько раз один и тот же двоичный файл).Если эти двоичные файлы также выполняют OpenMP или многопоточность (любой вид многопроцессорной обработки в одном и том же узле), вам также необходимо сообщить, сколько процессоров будет использовать каждую задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...