Работа с 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.