Skip to content

Работа с 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=. При этом система предоставляет узел для процесса, если на нем имеется указанное число свободных ядер. Максимальное число ядер, равное 36, содержат узлы раздела apollo (см. Кластер "Уран"). Пусть задано export OMP_NUM_THREADS=12, тогда в результате выполнения команды интерактивного запуска

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.