11.8. 处理器与内存亲和性
11.8.1. 处理器亲和性
Open MPI 通过进程绑定支持多种系统上的处理器亲和性,其中每个MPI进程及其线程会被"绑定"到特定的处理资源子集(核心、封装等)。也就是说,操作系统会将该进程限制为仅在该子集上运行。
注意
操作系统可能允许其他进程在同一资源上运行。
通过限制进程的过度迁移(例如远离"热"缓存或NUMA内存),亲和性可以提升性能。明智的绑定策略能通过减少资源竞争(通过分散进程分布)或改善进程间通信(通过使进程彼此靠近)来提高性能。绑定还能通过消除进程位置的不确定性,提升性能的可复现性。
警告
当节点被超额订阅时(即启动的进程数量超过处理器数量),可能不应使用处理器亲和性设置。
这可能导致性能严重下降(甚至比单纯超额订阅节点更严重)。Open MPI通常会检测到这种情况并自动禁用处理器亲和性(同时显示运行时警告以提示此问题)。
11.8.2. 内存亲和性
在现代服务器上,内存亲和性至关重要,因为大多数架构都采用非统一内存访问(NUMA)架构。在NUMA架构中,内存虽然被虚拟视为单个地址空间,但实际上在物理上是分布在整个机器中的。也就是说,内存可能在物理上靠近一个或多个处理器——因此对其他处理器而言就是远程的。
简单来说:对于某个进程而言,某些内存区域的访问速度会比其他区域更快。
Open MPI支持通用和特定的内存亲和性,这意味着它通常会尝试将所有内存分配在请求它的处理器本地。当使用共享内存进行通信时,Open MPI利用内存亲和性确保特定页面位于特定进程本地,以最小化内存网络/总线流量。
Open MPI支持多种系统的内存亲和性,并通过硬件局部性(hwloc)库进行控制。
请注意,内存亲和性支持仅在启用处理器亲和性时才会生效。具体而言:如果未启用处理器亲和性,使用内存亲和性将失去意义,因为进程可能先分配本地内存,随后迁移到其他处理器,导致与刚分配的内存存在潜在远程访问问题。