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