c++ - MPI_Comm_spawn 失败,返回 "All nodes which are allocated for this job are already filled"

标签 c++ openmpi pbs qsub torque

我正在尝试使用 Torque 的 (5.1.1) qsub 命令启动多个 OpenMPI 进程,每个节点一个进程,并让每个进程启动一个 使用 MPI_Comm_spawn() 在其自己的 本地 节点上处理。 MPI_Comm_spawn() 正在报告:

All nodes which are allocated for this job are already filled.

我的 OpenMPI 版本是 4.0.1。

我按照此处的说明来控制节点的映射。

Controlling node mapping of MPI_COMM_SPAWN

使用 mpiexec 的 --map-by ppr:1:node 选项和主机文件(以编程方式派生 来自 Torque 生成的 ${PBS_NODEFILE} 文件)。我的派生文件 MyHostFile 看起来 像这样:

n001.cluster.com slots=2 max_slots=2
n002.cluster.com slots=2 max_slots=2

而原来的 ${PBS_NODEFILE} 只有节点名称,没有插槽规范。

我的 qsub 命令是

qsub -V -j oe -e ./tempdir -o ./tempdir  -N MyJob   MyJob.bash

MyJob.bash 中的 mpiexec 命令是

mpiexec --display-map --np 2 --hostfile MyNodefile --map-by ppr:1:node <executable>.

MPI_Comm_spawn() 导致打印此错误:

Data for JOB [22220,1] offset 0 Total slots allocated 1   <=====

 ========================   JOB MAP   ========================

 Data for node: n001    Num slots: 1    Max slots: 0    Num procs: 1
        Process OMPI jobid: [22220,1] App: 0 Process rank: 0 Bound: socket 0[core 0[hwt 0]]:[B/././././././././.][./././././././././.]

 =============================================================

All nodes which are allocated for this job are already filled.

我想到了两件事: (1) "Total slots allocated"上面是 1,但我至少需要两个可用的插槽。 (2) 尝试给mpiexec指定一个hostfile时可能不对 使用 Torque(尽管它源自 Torque 主机文件 ${PBS_NODEFILE})。也许我的派生主机文件被忽略了。

有没有办法让它工作?我试过重新编译 OpenMPI 没有 Torque 支持,希望能阻止 OpenMPI 交互 使用它,但它没有更改错误消息。

最佳答案

回答我自己的问题:向 qsub 命令添加参数 -l nodes=1:ppn=2 会在节点上保留 2 个处理器,即使 mpiexec 只启动一个进程。 MPI_Comm_spawn() 然后可以在第二个保留槽上生成新进程。

我还必须在没有 Torque 支持的情况下编译 OpenMPI,因为包含它会导致我的主机文件参数被忽略并使用 Torque 生成的主机文件。

关于c++ - MPI_Comm_spawn 失败,返回 "All nodes which are allocated for this job are already filled",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57452877/

相关文章:

c++ - OpenMPI 上的线程应用程序仅在节点上使用 1 个内核

linux - OpenMPI:ORTE 无法可靠地启动一个或多个守护进程

c++ - 为 OpenMP + MPI 应用程序定位资源

cluster-computing - 依赖于作业阵列的扭矩作业

c++ - 在 libgcrypt 中用 Crypto++ 解密加密数据的步骤

c++ - C++ 中的引用

c++ - MySql Connector 准备语句只传输 64 字节

c++ - 使用不同类型 boost program_options 值

mpi - 无法通过 mpirun 使用所有核心

c++ - 共享内存、MPI 和排队系统