Для постановки в очередь программ, написанных с использованием только стандарта OpenMP можно использовать скрипт mpisubmit.pl
c параметром -p равным 1 и параметром -t равным числу нитей. Однако в силу особенностей реализации, если запрашиваемое число нитей больше 8, то параметр p должен быть кратен 4, а запрашиваемые ядра для задачи будут распределены между вычислительными узлами.
Если тем не менее нужно использовать более 8 потоков на одном вычислительном узле, то можно воспользоваться следующим командным файлом (назовем его OpenMP_job.lsf):
#BSUB -n M #BSUB -W 00:15 #BSUB -o "my_job.%J.out" #BSUB -e "my_job.%J.err" #BSUB -R "span[hosts=1]" OMP_NUM_THREADS=N ./my_job
Здесь параметр N
указывает число OpenMP нитей и не может быть больше 160. А параметр M
число запрашиваемых ядер и рассчитывается исходя из того, что возможно 8 потоков на одно ядро, т.е. M = [N/8]+1.
Здесь и далее не поясняются параметры, используемые в командных файлах более подробно об этом смотрите в разделах постановка заданий в очередь
и постановка заданий в очередь с использованием командного файла
bsub < OpenMP_job.lsf
Если необходимо привязать OpenMP нить к ядру, то есть чтобы каждое ядро использовало только один поток, то можно использовать следующий командный файл:
#BSUB -J "OpenMP_job" #BSUB -o "OpenMP_job%J.out" #BSUB -e "OpenMP_job%J.err" #BSUB -R "affinity[core(N)]" /polusfs/lsf/openmp/launchOpenMP.py ./Job_OMP
Здесь N число потоков, чтобы оставаться в рамках одного вычислительного узла, оно не должно быть больше числа ядер в узле. Нет необходимости устанавливать переменную OMP_NUM_THREADS
она установиться автоматически. Для корректной привязки потока к ядру используется специальный скрипт launchOpenMP.py
.
Если нужно использовать больше потоков на ядро, то тогда мы выставляем переменную OMP_NUM_THREADS
как это указано в следующем примере:
#BSUB -J "OpenMP_job" #BSUB -o "OpenMP_job%J.out" #BSUB -e "OpenMP_job%J.err" #BSUB -R "affinity[core(4)]" OMP_NUM_THREADS=8 /polusfs/lsf/openmp/launchOpenMP.py ./Job_OMP
Здесь используются 4 ядра и 8 OpenMP потоков.
Если есть необходимость привязать поток непосредственно к потоку процессора, то делается это следующим образом:
#BSUB -J "OpenMP_job" #BSUB -o "OpenMP_job%J.out" #BSUB -e "OpenMP_job%J.err" #BSUB -R "affinity[cpu(N)]" /polusfs/lsf/openmp/launchOpenMP.py ./Job_OMP
Здесь N
как и раньше означает число OpenMP потоков и не может быть больше числа процессоров.