You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双NUMA节点下MPI代码性能无法提升的技术求助

双Xeon NUMA架构下MPI扩展性能瓶颈问题

我的设备是Precision-Tower-7810,搭载双Xeon E5-2680v3 @2.50GHz处理器,共48线程。以下是lscpu命令的输出结果:

Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   46 bits physical, 48 bits virtual
CPU(s):                          48
On-line CPU(s) list:             0-47
Thread(s) per core:              2
Core(s) per socket:              12
Socket(s):                       2
NUMA node(s):                    2
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           63
Model name:                      Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz
Stepping:                        2
CPU MHz:                         1200.000
CPU max MHz:                     3300,0000
CPU min MHz:                     1200,0000
BogoMIPS:                        4988.40
Virtualization:                  VT-x
L1d cache:                       768 KiB
L1i cache:                       768 KiB
L2 cache:                        6 MiB
L3 cache:                        60 MiB
NUMA node0 CPU(s):               0-11,24-35
NUMA node1 CPU(s):               12-23,36-47
Vulnerability Itlb multihit:     KVM: Mitigation: VMX disabled

我的MPI代码基于基础MPI接口(Isend、Irecv、Wait、Bcast)实现,核心逻辑:

  • 先将数据分发至所有处理器
  • 各处理器利用数据完成计算并更新数值
  • 所有处理器间交换数据
  • 循环执行至达到限定次数

核心性能问题

当处理器数量在单个芯片(24线程)范围内增加时,性能随之提升;但当处理器数量超过24线程后,性能不再改善。测试示例如下:

$mpiexec -n  6 ./mywork : 72s
$mpiexec -n 12 ./mywork : 46s
$mpiexec -n 24 ./mywork : 36s
$mpiexec -n 32 ./mywork : 36s
$mpiexec -n 48 ./mywork : 35s

已分别在OpenMPI和MPICH环境下测试,结果一致。推测问题源于双芯片的NUMA节点物理连接方式,寻求相关技术帮助。


排查与优化方向

  1. NUMA亲和性绑定

    • 默认MPI进程可能跨NUMA节点调度,导致跨节点内存访问延迟飙升。需将进程绑定到对应NUMA节点的CPU核心:
      • OpenMPI:添加--bind-to numa参数,例如mpiexec -n 48 --bind-to numa ./mywork
      • MPICH:使用--bind-to numa或通过numactl手动绑定:numactl --cpunodebind=0,1 --membind=0,1 mpiexec -n 48 ./mywork
    • 更精细的绑定可按socket分配,比如OpenMPI用--bind-to socket,确保每个socket上的进程仅访问本地内存。
  2. 数据分布优化

    • 初始数据分发时,按NUMA节点划分数据块,避免跨节点内存拷贝。确保每个节点的进程只访问本地内存区域。
    • 调整通信逻辑,优先完成NUMA节点内的数据交换,减少跨节点MPI通信量。例如先做节点内同步,再进行节点间全局同步。
  3. 内存访问本地化

    • 用numactl --hardware查看NUMA节点内存分布,在代码中使用NUMA-aware分配函数(如numa_alloc_local)或posix_memalign分配内存,避免跨节点频繁访问。
  4. 通信逻辑分层优化

    • 将全局Bcast替换为分层广播:先在NUMA节点内广播,再在节点间广播,降低跨节点数据传输量。
    • 检查Isend/Irecv使用,合并不必要的跨节点通信请求,减少通信开销。

内容的提问来源于stack exchange,提问作者Văn Đức Nguyễn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:27:20