Вы здесь

Компиляция и запуск задач с 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.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 по умолчанию) процессу (задаче) пользователя будет выделено 6 ядер на узле и при вычислениях будет задействовано 12 нитей; результаты вычислений будут записаны в указанный пользователем файл exam_i.out.

Если программе нужен запуск на узле с большим объёмом оперативной памяти, то надо добавить опцию --mem=<MB>, где <MB> - требуемый объём памяти на узле. Например, команда

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

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

В пакетном режиме соответствующий запуск может выглядеть так:

sbatch  --mem-per-cpu=3G  --cpus-per-task=12 mybat_omp

где файл mybat_omp содержит строки

#!/bin/sh
srun exam_omp  > exam_omp.out

Возможен запуск гибридных MPI/OpenMP приложений с помощью опции --ntasks-per-node=<ntasks>, где <ntasks> - число процессов на узле. Например, для запуска на двух 36-ядерных узлах 6 процессов с 12 нитями каждый можно выполнить команду:

sbatch -N 2 --cpus-per-task=12 --ntasks-per-node=3  my_bat_omp