单节点运行Intel HPL基准测试:参数配置一致性及OMP线程疑问
解决Intel HPL单节点配置的MPI/OMP参数困惑
首先得帮你厘清两个核心误解:你可能混淆了纯MPI并行和MPI+OpenMP混合并行的参数逻辑,另外大概率是对Intel文档里的MPI_PER_NODE定义理解错了。
先澄清MPI参数的矛盾点
Intel文档里的MPI_PER_NODE绝对不是指「插槽数」——如果是单节点运行,mpirun -perhost的值必须等于总MPI进程数(也就是-np的值),不然你只有一个节点,没法把56个进程分配成「每个节点2个」。
那文档里的描述为什么会提到插槽数?其实是针对混合并行场景的:当你用每个插槽跑一个MPI进程时,MPI_PER_NODE就等于插槽数(2),这时候总MPI进程数MPI_PROC_NUM也是2,而不是56。这时候PxQ是MPI进程数 × OpenMP线程数,刚好等于总核数56。
两种可行的配置方案(针对你的2颗Xeon 8276/56核节点)
方案1:纯MPI并行(每个核一个MPI进程)
适合不想折腾混合并行的场景,每个物理核跑独立的MPI进程:
MPI_PROC_NUM = 56→ 对应mpirun -np 56MPI_PER_NODE = 56→ 对应mpirun -perhost 56(单节点下必须和-np一致)OMP_NUM_THREADS = 1→ 完全关闭OpenMP- HPL的
PxQ = 56→ 选P和Q的乘积为56的组合(比如P=8、Q=7,尽量让两者数值接近,或者匹配CPU的缓存/总线架构) - 运行命令示例:
export OMP_NUM_THREADS=1 mpirun -np 56 -perhost 56 -bind-to core ./xhpl
方案2:MPI+OpenMP混合并行(更适配Xeon NUMA架构)
Xeon Platinum 8276每个插槽是28核,对应一个NUMA节点,这种模式下性能通常更好:
MPI_PROC_NUM = 2→ 对应mpirun -np 2(每个插槽跑一个MPI进程)MPI_PER_NODE = 2→ 对应mpirun -perhost 2(单节点下2个进程)OMP_NUM_THREADS = 28→ 每个MPI进程绑定28个线程(刚好是单插槽的所有核)- 额外设置线程绑定参数(必须加,不然性能会崩):
export OMP_PROC_BIND=close export OMP_PLACES=cores - HPL的
PxQ = 2×28 = 56→ 可以选P=2、Q=28,或者P=4、Q=14,尽量让P匹配MPI进程数 - 运行命令示例:
export OMP_NUM_THREADS=28 export OMP_PROC_BIND=close export OMP_PLACES=cores mpirun -np 2 -perhost 2 -bind-to numa ./xhpl
关键提醒
- 如果你坚持用纯MPI模式,
MPI_PER_NODE必须设为56,和-np一致,不然mpirun会报错说节点数量不够。 - 混合并行的核心是利用NUMA架构,避免跨插槽的内存访问延迟,所以一定要加
OMP_PROC_BIND和OMP_PLACES参数,MPI进程也要绑定到NUMA节点(-bind-to numa)。
内容的提问来源于stack exchange,提问作者lost
相关产品推荐
相关产品推荐

