文章目录
- 一、基本语法
- 二、常用提示详解
- 1. **compute_bound**
- 2. **memory_bound**
- 3. **multithread**
- 4. **nomultithread**
- 5. **memory_interleaved**
- 6. **memory_local**
- 三、组合使用示例
- 四、注意事项
- 五、典型应用场景
sbatch是 Slurm 作业调度系统中用于提交批处理作业的命令。其中--hint参数用于向调度器提供关于 CPU 资源绑定(CPU affinity)或硬件特性的提示,帮助 Slurm 更智能地分配计算资源,尤其是在多核、NUMA 或异构架构系统中。
一、基本语法
sbatch--hint=<hint_spec>...<hint_spec>是一个逗号分隔的提示列表(大小写不敏感),常用的值包括:
compute_boundmemory_boundmultithreadnomultithreadmemory_interleavedmemory_localhelp(显示可用提示)
二、常用提示详解
1.compute_bound
- 含义:作业是计算密集型的,希望优先使用物理核心(而非超线程逻辑核心)。
- 效果:Slurm 会尽量将任务绑定到不同的物理核心上,避免超线程共享资源造成的性能干扰。
- 适用场景:CPU 密集型任务(如科学计算、仿真)。
2.memory_bound
- 含义:作业是内存带宽/延迟敏感的。
- 效果:Slurm 会尝试将任务绑定到靠近内存控制器的 CPU 核心(如 NUMA 节点本地内存),以减少跨 NUMA 访问。
- 适用场景:大内存访问、缓存敏感型程序。
3.multithread
- 含义:允许使用超线程(Hyper-Threading / SMT),即一个物理核心上的多个逻辑核心。
- 效果:调度器可能将多个任务线程分配到同一物理核心的不同逻辑核心上。
- 注意:只有在节点启用了超线程且 Slurm 配置允许时才有效。
4.nomultithread
- 含义:禁止使用超线程,只使用物理核心。
- 效果:每个任务独占一个物理核心,避免逻辑核心竞争。
- 等效于:
--hint=compute_bound(在多数配置下)。
⚠️
multithread和nomultithread是互斥的,不能同时指定。
5.memory_interleaved
- 含义:希望内存分配在多个 NUMA 节点间交错(interleaved)。
- 效果:适用于需要大内存带宽且能容忍跨 NUMA 延迟的程序。
- 底层实现:通常通过
numactl --interleave=all实现。
6.memory_local
- 含义:希望内存分配尽可能本地化(local allocation)。
- 效果:每个进程/线程使用其运行所在 NUMA 节点的本地内存,减少远程内存访问。
- 底层实现:通常通过
numactl --localalloc实现。
三、组合使用示例
# 提交一个计算密集型且禁用超线程的作业sbatch--hint=compute_bound,nomultithread script.sh# 提交一个内存敏感型作业,要求本地内存分配sbatch--hint=memory_bound,memory_local script.sh四、注意事项
依赖 Slurm 配置:
--hint的实际效果取决于集群的 Slurm 配置(如SelectType、TaskPlugin是否启用task/affinity)。- 若未启用 CPU 绑定插件,
--hint可能被忽略。
与
--cpus-per-task、--ntasks-per-core等参数协同:--hint=multithread通常需配合--ntasks-per-core=2(在双超线程系统中)才能生效。
查看实际绑定效果:
- 可在作业脚本中加入
taskset -p $$或numactl --show查看 CPU/内存绑定策略。
- 可在作业脚本中加入
--hint=help:- 在命令行运行
sbatch --hint=help可列出当前 Slurm 支持的所有 hint 选项。
- 在命令行运行
五、典型应用场景
| 场景 | 推荐--hint |
|---|---|
| 高性能计算(HPC)、MPI 并行 | compute_bound或nomultithread |
| 多线程 OpenMP(希望用满超线程) | multithread |
| 内存带宽敏感(如 FFT、大矩阵运算) | memory_bound,memory_local |
| 需要最大内存带宽(容忍跨 NUMA) | memory_interleaved |