MPI进程在多CPU Socket节点的分配规则与绑定方法咨询
MPI进程调度与绑定相关问题解答
问题1:8个进程的默认Socket分配规则
- 没有强制绑定的前提下,分配逻辑取决于你使用的MPI实现以及操作系统的默认调度策略,不存在统一的固定行为。
- 主流MPI实现(OpenMPI、MPICH等)默认都不会开启CPU绑定,空载节点上操作系统调度器有概率优先将8个进程都分配到同一个Socket的空闲核心以降低功耗,但完全有可能出现进程分散到两个Socket的情况,无法做绝对保证。
问题2:是否会发生跨Socket上下文切换
- 会。没有做CPU绑定时,操作系统调度器会根据全局核心负载动态调整进程的运行核心,完全可能将进程从一个Socket的核心迁移到另一个Socket的核心上,这种跨NUMA节点的迁移不仅会带来性能损耗,也会导致你采集的能耗数据对应两个Socket,无法准确关联到进程实际运行的硬件资源。
问题3:是否可以通过绑定核心/Socket保证能耗测量准确
- 可以,且做能耗测量时非常推荐做强制绑定来排除调度干扰。你可以通过两种方式实现绑定:
- 用MPI自带的绑定参数:OpenMPI可以加
--bind-to socket参数直接绑定到单Socket,也可以用--cpu-set 0-7指定具体核心编号;MPICH可以用--bind-to core或-cpu-list参数指定核心范围。示例命令如下:
# OpenMPI绑定到Socket 0的8个核心 mpiexec -n 8 --bind-to socket -f /pathtohostfile/host_file_test ./a.out- 结合likwid工具自带的pin功能直接绑定,比如下方命令可以将8个进程全部绑定到Socket 0的0~7号核心:
mpiexec -n 8 likwid-pin -c S0:0-7 -f /pathtohostfile/host_file_test ./a.out - 用MPI自带的绑定参数:OpenMPI可以加
内容的提问来源于stack exchange,提问作者Vivek Mahto
相关产品推荐
相关产品推荐

