平面分配: -m plane=plane_size
平面分配以循环方式在分配的节点上分配大小为 plane_size 的任务块。
要指定平面分配,请在 srun 命令行中添加 --distribution=plane=plane_size 或 -m plane=plane_size 其中 plane_size 是请求的平面/块大小。
平面分配示例
在下面的示例中,我们假设有 21 个任务,任务列表为: 0, 1, 2, 3, 4, ..., 19, 20。
在 一个 (1) 节点上: srun -N 1-1 -n 21 -m plane=4 <...>。
尽管用户指定了 plane_size 为 4,但最终的平面 分配结果为 plane_size 为 21,因为所有任务都落在一个节点上。

图 1: srun -N 1-1 -n 21 -m plane=4 <...> 的进程布局
在 四 (4) 节点上: srun -N 4-4 -n 21 -m plane=4 <...>。
平面分配的 plane_size 为 4,任务 ID 的分配如下:

图 2: srun -N 4-4 -n 21 -m plane=4 <...> 的进程布局
在 四 (4) 节点上: srun -N 4-4 -n 21 -m plane=2 <...> 。
平面分配的 plane_size 为 2,任务 ID 的分配如下:

图 3: srun -N 4-4 -n 21 -m plane=2 <...> 的进程布局
平面分配与任务亲和性
这种分配的概念是将集群划分为平面。每个平面包括每个 节点上最低级别的逻辑处理器(CPU、核心、线程,具体取决于架构)的数量。然后我们在每个平面内进行调度,然后在平面之间进行调度。
我们通过将进程亲和性设置为指定的/适当的逻辑处理器来确保进程的位置正确。进程亲和性在启用任务/亲和性插件时在 Slurm 中可用。
在一个双处理器节点上,具有四核处理器(见图 4),平面分配的结果为:
- 如果 plane_size=8,则为一个平面。在这种情况下,处理器首先通过填充节点进行调度,然后在节点之间进行调度。
- 如果 plane_size=1,则为八个平面。在这种情况下,我们总是首先在节点之间进行调度。

图 4: 四核双处理器系统
在多核/超线程环境中,两个平面将提供更好的局部性,但可能会对其他资源造成更多争用。
另一方面,四个平面(在处理器之间调度)将最小化对缓存和内存的争用。
启用进程亲和性的平面分配示例
在下面的示例中,我们假设有 21 个任务,任务列表为: 0, 1, 2, 3, 4, ..., 19, 20。
在 一个 (1) 节点上: srun -N 1-1 -n 21 -m plane=4 --cpu-bind=core <...>。 尽管用户指定了 plane_size 为 4,但最终的平面 分配结果为 plane_size=8 的平面分配。

图 5: srun -N 1-1 -n 21 -m plane=4 --cpu-bind=core <...> 的进程布局。
在 四 (4) 节点上: srun -N 4-4 -n 21 -m plane=4 --cpu-bind=core <...>。 平面分配的 plane_size 为 4,任务 ID 的分配如下:

图 6: srun -N 4-4 -n 21 -m plane=4 --cpu-bind=core <...> 的进程布局。
在 四 (4) 节点上: srun -N 4-4 -n 21 -m plane=2 --cpu-bind=core <...> 。平面分配的 plane_size 为 2,任务 ID 的分配如下:

图 7: srun -N 4-4 -n 21 -m plane=2 --cpu-bind=core <...> 的进程布局。
最后修改于 2021 年 4 月 22 日