MPI(二)- 进程调度,绑定

单节点情况下

不显式绑定CPU核心

MPI运行时环境会依赖操作系统来管理MPI进程与CPU核心的映射和调度。操作系统会尝试均匀分配负载,但可能会出现缓存污染、上下文切换开销增加以及 NUMA 访问延迟等问题。

  • 默认调度

   操作系统的默认调度器会将进程分配到可用的 CPU 核心上,尝试均匀分布负载。

   MPI 进程可能会在不同的时间段运行在不同的核心上(也就是说,进程可能会迁移)。

  • 超线程

          如果系统支持超线程,每个物理核心可能会有多个逻辑核心。操作系统可能会将 MPI 进程调度到这些逻辑核心上,这可能导致性能下降,因为多个进程共享相同的物理资源。

显式绑定CPU核心

将 MPI 进程与 CPU 核心绑定(也称为 CPU 亲和性)可以提高性能,因为它减少了上下文切换和缓存失效。

  • mpirun --bind-to core --map-by core -np 4 ./your_mpi_programopenmpi

   --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_programintelmpi

     I_MPI_PIN=1:启用进程绑定。

          I_MPI_PIN_DOMAIN=core:将进程绑定到单独的核心。

注:进程绑定只能减低系统原因带来的性能影响,而不解决任何程序本身存在的问题 ,尤其是负载不均衡导致的性能波动(甚至可能在绑核后变得更明显)。此外,绑定仅仅指将进程/线程限制在指定的 CPU 核心上,但仍然可能有其他进程抢占这些资源。即使进程独占了一部分核心,其他核心上的进程 也可能对其性能产生影响(如抢占共享的 cache 或内存带宽)。

posted @ 2024-05-30 20:43  酥炸小黄瓜  阅读(1040)  评论(0)    收藏  举报