Вы здесь

Компиляция и запуск приложений с 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=<ncpus>. При этом система предоставляет узел для процесса, если на нем имеется указанное число свободных ядер. Максимальное число ядер, равное 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=<MB>, где <MB> - требуемый объём памяти на узле. Например, команда

srun  --mem=48G  --cpus-per-task=12  exam_omp  > exam_omp.out

запустит один процесс на узле с оперативной памятью не меньшей, чем 48 GB (о типах узлов см. Кластер "Уран"). Для заказа памяти из расчета на одно ядро используется опция --mem-per-cpu=<MB>, например,

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=<ntasks>, где <ntasks> - число процессов на узле. Например, для запуска на двух 36-ядерных узлах 6 процессов с 12 нитями каждый можно выполнить команду:

sbatch -N 2 --cpus-per-task=12 --ntasks-per-node=3  my_bat_omp
Яндекс.Метрика