Для постановки в очередь программ, написанных с использованием только стандарта 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 потоков и не может быть больше числа процессоров.