我正在使用一个 MPI 程序,它将一个巨大的样本空间平等地划分为工作线程并并行完成工作。我正在使用以下脚本提交我的工作。
#!/bin/bash
#PBS -l nodes=NNODES
mpirun -np NPROC ./run >log
我从集群网页中发现每个节点有 10 个内核。我天真地假设如果我需要 100 个工作线程 (NPROC),我只需要请求 10 个节点 (NNODES)。但是,我发现当我增加 NNODES 时,程序运行的 walltime 一直在减少。
我猜这是因为在为每个节点分配 1 而不是多个工作线程时资源竞争较少。如果这是真的,我认为当 NNODES==100(NPROC) 时,挂墙时间也会趋于平稳,因为现在每个节点将有 1 个工作线程,如果我们有更多节点,它不会进一步减少挂墙时间比请求的工作线程。
然而,我又错了,因为进一步增加 NNODES 超过 100(NPROC) 几乎线性地进一步减少了墙时间。这真的让我很困惑,因为源代码实际上是从上面的脚本中读取 NPROC 并将样本划分为它们,我无法理解为什么请求比工作线程更多的节点会使事情变得更快。