Работа с MPI
Выбор версии MPI и компилятора
Для выбора компиляторов, библиотек обмена сообщениями и пакетов прикладных программ, необходимых для работы программы пользователя, используются модули установки переменных окружения.
Команда mpiset
позволяет выбрать модуль из списка основных модулей, задающих компилятор и версию библиотеки MPI.
Команда mpiset
без параметров выдает пронумерованый список доступных вариантов. Строка, помеченная словом active
, указывает на текущие настройки.
Для смены модуля (библиотеки MPI, компилятора) необходимо выполнить команду
mpiset
Компиляция и запуск приложений с OpenMP
OpenMP подключается опцией, соответствующей установленному компиляторy:
gcc/gfortran -fopenmp GNU icc/ifort -openmp Intel (по умолчанию на umt) pgcc/pgCC/pgf77/pgfortran -mp PGI Так, компиляция файла exam.c на umt компилятором Intel (с учетом умолчания) выполняется командой
icc -openmp exam_omp.c -o exam_omp или командой
mpicc -openmp exam_omp.c -o exam_omp
Мультипроцессинг
Число параллельных нитей OpenMP задается с помощью переменной окружения OMP_NUM_THREADS
. Как правило, она устанавливается перед запуском программы из командной строки командой вида
export OMP_NUM_THREADS=8
- Если число нитей больше числа выделенных процессу ядер, то, по крайней мере, одно ядро будет исполнять более одной нити, что целесообразно, например, в случае, когда часть нитей имеет меньшую вычислительную активность.
При запуске приложения пользователю необходимо указать число ядер (cpus) для каждого из процессов (task) с помощью опции --cpus-per-task=
srun --cpus-per-task=6 exam_omp > exam_omp.out одному (n=1 по умолчанию) процессу (task), т.е. задаче, пользователя будет выделено 6 ядер на узле и при вычислениях будет задействовано 12 нитей; результаты вычислений будут записаны в указанный пользователем файл exam_omp.out.
- Если программе нужен запуск на узле с большим объёмом оперативной памяти, то надо добавить опцию --mem=
, где - требуемый объём памяти на узле. Например, команда
srun --mem=48G --cpus-per-task=12 exam_omp > exam_omp.out
запустит один процесс на узле с оперативной памятью не меньшей, чем 48 GB (о типах узлов см. Кластер "Уран"). Для заказа памяти из расчета на одно ядро используется опция --mem-per-cpu=
srun --mem-per-cpu=4G --cpus-per-task=12 exam_omp > exam_omp.out В пакетном режиме соответствующий запуск может выглядеть так:
sbatch --mem-per-cpu=4G --cpus-per-task=12 mybat_omp где файл mybat_omp содержит строки
!/bin/sh
srun exam_omp > exam_omp.out В качестве примера программы с OpenMP можно использовать pi_omp.c.
- Возможен запуск гибридных MPI/OpenMP приложений с помощью опции --ntasks-per-node=
, где - число процессов на узле. Например, для запуска на двух 36-ядерных узлах 6 процессов с 12 нитями каждый можно выполнить команду:
sbatch -N 2 --cpus-per-task=12 --ntasks-per-node=3 my_bat_omp
Запуск программ, использующих MPI
Запуск исполнения MPI-программы производится с помощью команды:
mpirun [параметры_mpirun...] <имя_программы>[парамет-ры_программы...] [-host ]
Параметры команды mpirun:
-
h
- интерактивная подсказка по параметрам команды mpirun. -
maxtime
<максимальное_время> - Максимальное время счета. От этого времени зависит положение задачи в очереди. После истечения этого времени задача принудительно заканчивается. -
np <число_процессоров>
- Число процессоров, необходимое в программе. -
quantum <значение_кванта_времени>
- Этот параметр указывает, что задача является фоновой, и задает размер кванта для фоновой задачи.
-restart
- Указание этого ключа приведет к тому, что после своего завершения задача будет вновь поставлена в очередь. Для удаления из очереди такой задачи пользуйтесь стандартной командой mqdel, а для ее завершения - командами mkill или mterm.
-
stdiodir <имя_директории>
- Этот параметр задает имя каталога стандартного ввода/вывода, в который будут записываться протокол запуска задачи, файл стандартного вывода и имена модулей, на которых задача запускалась. -
stdin <имя_файла>
- Этот параметр задает имя файла, на который будет перенаправлен стандартный ввод задачи. -
stdout <имя_файла>
- Этот параметр задает имя файла, на который будет перенаправлен стандартный вывод задачи. -
stderr <имя_файла>
- Этот параметр задает имя файла, на который будет перенаправлен стандартный вывод сообщений об ошибках задачи. -
interactive
- Задание этого ключа делает задачу интерактивной, а также отменяет действия ключей stdin, stdout, stderr. -
mountdir <имя_каталога_монтирования>
- Этот параметр оказывает влияние, только если указано имя ресурса ЛДП (параметр ldmname). Параметр mountdir задает имя каталога монтирования для ресурса ЛДП. Монтирование ресурса ЛДП к указанному Пользователем каталогу будет производиться перед стартом задачи на каждом вычислительном модуле. ВНИМАНИЕ! Монтирования ресурса ЛДП на сервер доступа или управляющую ЭВМ при старте задачи не производится! -
termtime <дополнительное_время>
- Этот параметр задает дополнительное время для завершения задачи. Время задается в минутах. -
termsignal <сигнал_для_завершения>
- Этот параметр оказывает влияние, только если задано дополнительное время для завершения задачи (параметр termtime). Параметр termsignal задает сигнал, который будет разослан всем процессам задачи в качестве предупреждения о предстоящем завершении. Формат задания сигнала должен соответствовать команде kill (pkill). Пользователь должен самостоятельно определить обработчик сигнала в своей программе. Подробнее о сигналах см. описание системных вызовов kill() и signal(). -
transform <имя_командного_файла>
- При запуске задачи происходит преобразование списка выделенных задаче вычислительных модулей в формат среды программирования MPICH. По умолчанию системой используется командный файл /common/runmvs/bin/p4togm.sh. Параметр имя_командного_файла задает командный файл, который выполнит указанное преобразование вместо стандартного файла p4togm.sh. Необходимо учесть, что при вызове данный командный файл получит два параметра: файл со списком узлов выделенных задаче и полное имя файла запускаемой программы. Подробнее форматы этих файлов и описание ключа transform можно найти в разделе "Интерфейс между средой для разработки параллельных программ и системой управления прохождением задач" Руководства администратора. -
width
- Использовать альтернативный способ нумерации процессоров. По умолчанию процессы задачи распределяются по процессорам выделенных модулей в следующем порядке: 1-й процесс - на 1-й процессор 1-го модуля, 2?й процесс - на 1-й процессор 2-го модуля, 3-й процесс - на 1-й процессор 3-го модуля и т.д. После занятия всех 1-х процессоров всех выделенных модулей занимаются 2-е процессоры в том же порядке.
При указании ключа width используется другой способ нумерации: 1-й процесс - на 1-й процессор 1-го модуля, 2?й процесс - на 2-й процессор 1-го модуля, 3-й процесс - на 1-й процессор 2?го модуля и т.д.
Результат запуска задачи
Удачно запущенная задача получает определенный номер, который добавляется к имени задачи. Это позволяет пользователю запускать одновременно несколько экземпляров задачи с одним и тем же именем - система присвоит каждому экземпляру задачи уникальный номер. Для каждого экземпляра будет создан отдельный каталог стандартного ввода/вывода. По завершении задачи ее номер "освобождается" и будет использован повторно. При удачном старте система выдаст пользователю следующую информацию:
-
имена свободных узлов в системе на момент запуска задачи;
-
имена выделенных под задачу узлов;
-
сведения о принятых системой установках по умолчанию.
Удачный старт задачи завершается выдачей сообщения, причем в сообщении указывается присвоенный задаче номер, например:
Task "test.1" started successfully
Может случиться так, что задача не будет запущена сразу, а поставлена в очередь. В этом случае реакция системы будет следующей:
Task "test.1" was queued
В процессе работы команды mpirun образуется файл паспорта задачи <имя_программы>.img. Данный файл может быть использован в команде mrunf.