双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节点物理连接方式,寻求相关技术帮助。
排查与优化方向
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
- OpenMPI:添加
- 更精细的绑定可按socket分配,比如OpenMPI用
--bind-to socket,确保每个socket上的进程仅访问本地内存。
- 默认MPI进程可能跨NUMA节点调度,导致跨节点内存访问延迟飙升。需将进程绑定到对应NUMA节点的CPU核心:
数据分布优化
- 初始数据分发时,按NUMA节点划分数据块,避免跨节点内存拷贝。确保每个节点的进程只访问本地内存区域。
- 调整通信逻辑,优先完成NUMA节点内的数据交换,减少跨节点MPI通信量。例如先做节点内同步,再进行节点间全局同步。
内存访问本地化
- 用
numactl --hardware查看NUMA节点内存分布,在代码中使用NUMA-aware分配函数(如numa_alloc_local)或posix_memalign分配内存,避免跨节点频繁访问。
- 用
通信逻辑分层优化
- 将全局
Bcast替换为分层广播:先在NUMA节点内广播,再在节点间广播,降低跨节点数据传输量。 - 检查
Isend/Irecv使用,合并不必要的跨节点通信请求,减少通信开销。
- 将全局
内容的提问来源于stack exchange,提问作者Văn Đức Nguyễn
相关产品推荐
相关产品推荐

