2013-06-25 2 views
0

Я хочу использовать LSF представить работу, которая:Как запустить многопоточные процессы mpi в lsf?

  • работает на 4-х узлов, параллельно
  • каждый узел имеет один процесс МПИ
  • каждый процесс имеет 12 потоков

В отсутствие LSF я просто запускаю с mpi на 4 узла, например:

mpirun -hosts host1, host2, host3, host4 -np 4. ./myprocess --numthreads = 12

Однако, в присутствии LSF, я не вижу, как это сделать? Я уверен, что есть, вероятно, очень стандартный способ сделать это, но я совершенно новичок в LSF. Я искал гугл, но ответ мне не сразу стал очевидным. Я нашел Hybrid MPI/OpenMP in LSF, но, похоже, это не совсем то же самое, кажется, нужен только один хост за раз.

ответ

5

Другой вопрос, который вы связали, дает вам именно то, что вам нужно, но вам нужно немного его адаптировать, поскольку он написан для приложений OpenMP, число потоков которых контролируется переменной окружения OMP_NUM_THREADS.

Вот наиболее важные части сценария работы:

  • #BSUB -n 4 - запрос 4 слота
  • #BSUB -R "span[ptile=1]" - запрос, что слоты распределены по одному на узел; этот вариант в сочетании с предыдущим охватывает работу более 4 различных узлов и инструктирует ФИ поставить один слот для каждого узла в созданном файле хост
  • #BSUB -x - запросить монопольный доступ к узлам

Вышеуказанные три варианта поручил LSF выделить 4 узла и зарезервировать один слот на каждом узле. Поскольку также запрашивается эксклюзивный доступ, никакие другие задания не будут совместно использовать одни и те же узлы с заданием, и вы можете запустить столько потоков, сколько захотите на каждый узел. Тогда вам нужно только позвонить Open MPI mpiexec, и если в настройке Open MPI была скомпилирована интеграция LSF, она автоматически подберет список хостов из LSF и запустит один процесс на узел.

LSF файл задания образца будет выглядеть следующим образом:

#BSUB -n 4 
#BSUB -R "span[ptile=1]" 
#BSUB -x 

mpiexec -np 4 ./myprocess --numthreads=12 

Убедитесь, что вы также запрашиваться достаточно времени работы с -W опции и достаточное количество оперативной памяти с возможностью -M. Память в LSF (как и в большинстве других распределенных менеджеров ресурсов) запрашивается за слот, поэтому вы должны указать максимальный объем памяти, который будет потреблять любой экземпляр ./myprocess.

Если интеграция LSF не скомпилирована в вашем дистрибутиве Open MPI, процесс несколько более активен, так как вам придется разбирать файл хостов LSF и создавать файл с открытым файлом MPI от первого.

+0

Спасибо! Вопрос: как будет выставлен счет? т. е. будет ли я выставлен счет за все ядра на хосте (что было бы предпочтительнее) или просто для одного ядра для каждого хоста (что, вероятно, привело бы к тому, что опция «-x» была не одобрена). –

+0

Это зависит от конфигурации. Обратитесь к системному администратору (ами). –

+0

Почему не '-n 48' и' -R 'span [ptile = 12] "'? Разве это не было бы более простым и не требовало бы '-x'? –

0

Несмотря на то, что я принял ответ Христа как правильный, вот что я сделал в конце, что позволяет избежать проблем с использованием '-x', -W и -M и соответствует тому, что сказал мой системный администратор :

#!/bin/bash 

machinefile="$(mktemp)" 
n=0 
cmdstring="mpirun -machinefile ${machinefile} " 
for host in $LSB_MCPU_HOSTS; do { 
    if [[ $host != 12 ]]; then { 
     echo $host>>$machinefile 
     n=$(($n+1)) 
    } fi 
} done 

echo $n 
echo [email protected] 

mpirun -machinefile ${machinefile} -np $n [email protected] 

Вы можете использовать этот сценарий, как, скажем, это называется 'lsfrun.sh':

bsub -n 48 -R "span[ptile=12]" ./lsfrun.sh ./myprocess --threads 12