8.9 其它共享资源的优化
在多线程应用中的资源优化依赖于处理器拓扑层级内相关联的Cache拓扑以及执行资源。在第7章中讨论了处理器拓扑以及标识处理器拓扑的一种软件算法。
在带有共享总线的平台中,总线系统被处于SMT层以及在处理器拓扑中的处理器核心层的多个代理所共享。因而多线程应用程序设计应该起始于管理对多个处理器代理可用的总线带宽的方法,这些处理器代理以一种合理的方式共享同一个总线连接。这可以通过提升独立应用程序线程的数据位置性或允许两个线程利用一个共享的L2 Cache(在该平台中,共享Cache是可用的)来达成。
一般来说,优化一个多线程应用的构建块可以从一个独立的线程开始。在第3章到第9章的所讨论的准则极大地应用于多线程优化。
调整建议3:先优化单线程代码来最大化执行吞吐。
调整建议4:引入高效的线程模型,利用可用的工具(诸如Intel Threading Buiding Block,Intel Thread Checker,Intel Thread Profiler)来实现最优的关于物理处理器个数或处理器核心的处理器尺度。
8.9.1 为HT优化的扩充的机会
在Intel微架构代号名为Nehalem中的超线程技术(HT)的实现与先前HT实现的处理器有所不同。它为多线程软件提供了更广泛的机会来利用HT并实现更高的系统吞吐,涉及更广泛的应用程序问题。这章提供了一些启发式的建议并描述了某些情景,在代号名为Nehalem的Intel微架构中的HT提供了更多优化机会。
第2章涵盖了某些在超线程技术中的微架构性能增强。这些增强特性中有很多都围绕着多线程软件这个中心点,就共享可能被多于一个线程上下文所使用的公共硬件资源而言。
不同的软件算法以及负载特征可能会产生不同的性能特征,由于它们对关键架构性资源的需求,可能在几个逻辑处理器之间被共享。对于各种不同的架构上子系统的简要比较在表8-3中概述,而该子系统会在对HT进行软件调整中扮演重要角色。
表8-3:与HT实现相比较的架构性资源
微架构子系统 || Intel微架构代码名Nehalem || Intel NetBurst微架构
|| 06_1AH || 0F_02H, oF_03H, 0F_04H, 0F_06H
发布端口,执行单元: || 三个发布端口(0,1,5)被分派来处理ALU、SIMD、FP计算 || 不平衡的端口,快速ALU、SIMD和FP共享同一个端口(端口1)
缓存: || 在ROB、RS中有更多条目,填充缓存等等,具有适度的流水线深度 || 在缓存条目和流水线深度之间有较少的平衡
分支预测以及错误对齐的存储器访问: || 更健壮的在错误预测之后的带有立即改造的投机执行;高效的Cache分裂的处理 || 更多架构性的危机导致流水线为两个线程都被清除
Cache一致性: || 更大且更高效 || 更多架构上的危机需要做调配
存储器与带宽: || NUMA,每个插座对DDR3有三个通道,每个插座高达32GB/s || SMP,FSB或双FSB,每个FSB高达12.8GB/s
对于计算绑定的工作负载,Intel NetBurst微架构趋于偏向以相对来说高CPI(隐退连续指令的平均周期)来执行的线程上下文。在硬件层,这部分由于微架构中发布端口的不平衡,由于端口1与快速ALU、缓慢ALU(任务更重的整数操作),SIMD以及FP计算所共享。在软件层,高CPI以及可能作为提供HT利益的良性的催化而出现的某些起因可以包括:长延迟指令(端口1),一些L2命中,偶尔的分支预测失败,等等。但Intel NetBurst微架构重的流水线的长度经常强行使用额外的内部硬件限制而限制软件利用HT的能力。
在表8-3中列出的微架构增强期望为计算绑定的工作负载提供更宽广的软件优化机会。由两个计算绑定的线程而竞争同一个执行单元,可能要比起数据分解线程更关注选择一个功能分解的线程模型。代号名为Nehalem的Intel微架构将可能更有助于支持程序员选择最优的线程分解模型。
存储器密集的工作负载能展示范围广泛的性能特征,范围从完整的并行存储器交通(吃透系统存储器带宽,就好比在众所周知的Stream的例子中),受存储器延迟支配的存储器交通,或任一种类型的计算操作与存储器交通的各种混合。
在Intel NetBurst微架构中的HT实现可以对工作负载特征的后两种类型的某些提供利益。在代号名为Nehalem的Intel微架构中的HT特性能加宽后两种类型工作负载特征的操作封装来传递更高的系统吞吐,由于它支持非统一的存储器访问(NUMA)、更高效的连接协议,以及随物理处理器的个数可缩放的系统存储器带宽。
某些Cache层级的Cache层可以被多个逻辑处理器所共享。使用Cache层级对于软件是一个重要方法来提升存储器交通的高效性,并避免饱和系统存储器带宽。引入Cache分块技术的多线程应用可以希望对一个目标Cache层进行划分来利用超线程技术。可替换地,共享同一个L1和L2的两个逻辑处理器,或共享L3的逻辑处理器可能希望根据它们相对的拓扑关系来共享资源。对处理器拓扑枚举以及Cache拓扑枚举,伴有参考代码的白皮书已经被发行了(见第1章结尾处的参考)。