我想用LSF提交一份工作:
在没有LSF的情况下,我只需在4个节点上启动mpi,例如:
mpirun -hosts host1,host2,host3,host4 -np 4 ./myprocess --numthreads = 12
然而,在有LSF的情况下,我看不出怎么做?我确信这可能是一种非常标准的方法,但我对LSF来说还是个新手。我用Google搜索,但答案对我来说并不是很明显。我发现Hybrid MPI/OpenMP in LSF,但它似乎并不完全相同,似乎一次只需要一个主机。
答案 0 :(得分:5)
您链接的另一个问题为您提供了所需的内容,但您必须稍微调整它,因为它是为OpenMP应用程序编写的,其线程数由OMP_NUM_THREADS
环境变量控制。 / p>
以下是工作脚本中最重要的部分:
#BSUB -n 4
- 请求4个插槽#BSUB -R "span[ptile=1]"
- 请求每个节点分配一个插槽;此选项与前一个选项一起跨越4个不同节点的作业,并指示LSF在生成的主机文件中为每个主机放置一个插槽#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
实例将占用的最大内存量。
如果未在Open MPI发行版中编译LSF集成,则该过程涉及更多,因为您必须解析LSF主机文件并从前者创建Open MPI主机文件。
答案 1 :(得分:0)
虽然我已经接受了Hristo的答案作为正确的答案,但这是我最后所做的,这避免了使用'-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 $@
mpirun -machinefile ${machinefile} -np $n $@
你使用这个脚本,比方说它叫'lsfrun.sh':
bsub -n 48 -R "span[ptile=12]" ./lsfrun.sh ./myprocess --threads 12