Постановка в очередь гибридных программ MPI+OpenMP

Для постановки в очередь гибридных программ, написанных с использованием только стандартов MPI и OpenMP можно использовать скрипт mpisubmit.pl c параметром -p равным числу MPI процессов и параметром -t равным числу нитей. Однако в силу особенностей реализации, если запрашиваемое число нитей больше 8, то параметр p должен быть кратен 4, а запрашиваемые ядра для задачи будут распределены между вычислительными узлами равномерно.

#BSUB -n M
#BSUB -W 00:15
#BSUB -o "my_job.%J.out"
#BSUB -e "my_job.%J.err"
OMP_NUM_THREADS=N mpiexec ./my_job

Здесь параметр N указывает число OpenMP нитей на один MPI процесс. Поскольку процессоры power8 имеют ядра в 8 потоков, значение данного параметра разумно задавать не больше 8, но разумеется возможно использование больших значений параметра N. Параметр M задает число запрашиваемых ядер и равно числу запрашиваемых MPI-процессов.

Здесь и далее не поясняются параметры, используемые в командных файлах более подробно об этом смотрите в разделах постановка заданий в очередь и постановка заданий в очередь с использованием командного файла

Если необходимо привязать OpenMP нить к ядру, то есть чтобы каждое ядро использовало только один поток в MPI процессе, то можно использовать следующий командный файл:

    #BSUB -n M
    #BSUB -J "my_job"
    #BSUB -o "my_job%J.out"
    #BSUB -e "my_job%J.err"
    #BSUB -R "affinity[core(N)]"
     mpiexec ./my_job

Здесь N число потоков, чтобы оставаться в рамках одного вычислительного узла, оно не должно быть больше числа ядер в узле. М как и раньше число MPI процессов. Произведение чисел m на n не может быть больше общего числа ядер (80). Нет необходимости устанавливать переменную OMP_NUM_THREADS она установиться автоматически.

Если нужно использовать больше потоков на ядро, то тогда мы выставляем переменную OMP_NUM_THREADS как это указано в следующем примере:

    #BSUB -n 3
    #BSUB -J "my_job"
    #BSUB -o "my_job%J.out"
    #BSUB -e "my_job%J.err"
    #BSUB -R "affinity[core(4)]"
    OMP_NUM_THREADS=8 
    mpiexec ./my_job

Здесь используются 3 MPI процесса, а каждый MPI процесс задействует 4 ядра и 2 OpenMP потока на ядро.