MPI(二)- 进程调度,绑定
单节点情况下
不显式绑定CPU核心
MPI运行时环境会依赖操作系统来管理MPI进程与CPU核心的映射和调度。操作系统会尝试均匀分配负载,但可能会出现缓存污染、上下文切换开销增加以及 NUMA 访问延迟等问题。
- 默认调度
操作系统的默认调度器会将进程分配到可用的 CPU 核心上,尝试均匀分布负载。
MPI 进程可能会在不同的时间段运行在不同的核心上(也就是说,进程可能会迁移)。
- 超线程
如果系统支持超线程,每个物理核心可能会有多个逻辑核心。操作系统可能会将 MPI 进程调度到这些逻辑核心上,这可能导致性能下降,因为多个进程共享相同的物理资源。
显式绑定CPU核心
将 MPI 进程与 CPU 核心绑定(也称为 CPU 亲和性)可以提高性能,因为它减少了上下文切换和缓存失效。
mpirun --bind-to core --map-by core -np 4 ./your_mpi_program
openmpi
--map-by core
:将 MPI 进程映射到不同的 CPU 核心。其主要目的是确保进程被合理地分布到可用的核心上,尽量避免多个进程同时占用同一个核心。这种映射策略可以优化进程之间的资源使用,减少资源争用。
--bind-to core
:将 MPI 进程绑定到具体的核心上。绑定的目的是确保进程在执行过程中始终运行在同一个核心上,防止操作系统将其迁移到其他核心,从而降低上下文切换的开销并提高缓存命中率。
mpirun -genv I_MPI_PIN 1 -genv I_MPI_PIN_DOMAIN core -np 4 ./your_mpi_program
intelmpi
I_MPI_PIN=1
:启用进程绑定。
I_MPI_PIN_DOMAIN=core
:将进程绑定到单独的核心。
注:进程绑定只能减低系统原因带来的性能影响,而不解决任何程序本身存在的问题 ,尤其是负载不均衡导致的性能波动(甚至可能在绑核后变得更明显)。此外,绑定仅仅指将进程/线程限制在指定的 CPU 核心上,但仍然可能有其他进程抢占这些资源。即使进程独占了一部分核心,其他核心上的进程 也可能对其性能产生影响(如抢占共享的 cache 或内存带宽)。