Oracle Solaris 操作系统支持可能提高 OpenMP 程序性能的功能。这些功能包括内存定位优化 (Memory Placement Optimization, MPO) 和多页大小支持 (Multiple Page Size Support, MPSS)。
共享内存多处理器计算机包含多个处理器。每个处理器均可访问计算机中的所有内存。在某些共享内存多处理器中,内存体系结构使每个处理器访问某些内存区域的速度快于访问其他区域的速度。因此,向访问内存的处理器分配其附近的内存,可以缩短延迟和提高应用程序性能。
Oracle Solaris 操作系统引入了地址组 (locality group, lgroup) 摘要,它属于 MPO 功能的一部分。lgroup 是一组类似处理器和类似内存的设备,在此类设备中,组中的每个处理器都可在有限的延迟间隔内访问该组中的任何内存。库 liblgrp.so 导出应用程序的 lgroup 摘要,以便进行观察和性能调优。应用程序可以使用 liblgrp.so API 执行以下任务:
遍历组分层结构
搜索给定 lgroup 的内容和特征
影响 lgroup 的线程和内存定位
缺省情况下,Oracle Solaris 操作系统尝试从线程的主 lgroup 为线程分配资源。例如,缺省情况下,操作系统会尝试调度线程在线程主 lgroup 中的处理器上运行,并在线程的主 lgroup 中分配线程的内存。
以下机制可用于发现和影响与 lgroup 有关的线程和内存定位方式:
meminfo() 系统调用可用于发现内存定位方式。
lgrp_home() 函数可用于发现线程定位方式。
通过设置线程与给定 lgroup 的关联性,lgrp_affinity_set() 函数可以影响线程和内存定位方式。
标准 C 库中的 madvise() 函数用于提醒操作系统:用户虚拟内存的区域遵守特定的使用模式。传递给 madvise() 的 MADV_ACCESS 标志用于影响 lgroup 之间的内存分配。例如,使用 MADV_ACCESS_LWP 标志调用 madvise() 将提醒操作系统:下一个访问指定地址范围的线程将是访问内存区域最多的线程。操作系统将放置与此范围对应的内存并会相应地放置线程。
有关 lgroup API 的更多信息,请参阅Oracle Solaris 11.3 Programming Interfaces Guide 中的 第 4 章, Locality Group APIs。有关 madvise() 函数的更多信息,请参见 madvise(3C) 手册页。
Oracle Solaris 中的多页大小支持 (Multiple Page Size Support, MPSS) 功能允许应用程序对不同的虚拟内存区域使用不同的页面大小。使用 pagesize 命令可以获取特定平台的缺省页面大小。在此命令中使用 -a 选项可列出所有受支持的页面大小。有关详细信息,请参见 pagesize(1) 手册页。
转换后备缓冲器 (Translation Lookaside Buffer, TLB) 是一种数据结构,用于将虚拟内存地址映射到物理内存地址。访问 TLB 中没有虚拟-物理映射信息的内存,会产生一些性能损失。页面大小越大,TLB 使用固定数量的 TLB 项就可以映射越多的物理内存。因此,较大的页面会降低虚拟-物理内存映射的开销,从而提高整体系统性能。
更改应用程序的缺省页面大小的方法有多种: