清楚地了解单处理器上的多线程(MT)和利用多处理器(MP)处理之间的差异至关重要。最普遍的误解是,MP和MT处理器是具有同等软件复杂度的相当的技术。这一点应该会引起许多设计工程师的兴趣。
重新考虑速度
在过去十年中,台式电脑处理器设计的差异化因素很简单,那就是速度。英特尔和AMD在处理器设计上都全身心地追求提高速度的方法,热衷于领先于另一方开发出更高频率的处理器。在抢先推出全球第一款1GHz处理器的白热化竞争中,AMD脱颖而出成为赢家。但在这期间,业界慢慢开始认识到:处理器的时钟速度越高,硬件的复杂性也会随之增长。
业界还意识到:速度提高的路线不可能无限制地走下去,需要采取其它办法。除了改善处理器的效率外,通过MP或MT技术实现多处理而获得的线程级并行可以提高总体性能。
英特尔是第一个推动称为超线程(Hyper-Threading)的MT技术的公司,而AMD则将自身定位于双核与64位处理器。但是这个过程也变成了一场双核竞赛,两家公司都千方百计地要成为第一个为家庭和商业计算应用提供真正的多处理器解决方案的公司。
最近,这种向多处理转移的趋势已推动着台式电脑的软件技术进入嵌入式设计中。多年以来,嵌入式设计工程师一直在他们的设计中采用MP,以在有限的功率预算内提供所需要的计算性能。
在嵌入式市场现在真正的变化是:应用软件必须把通用处理器单元视为一个多处理系统,以从可能实现的更高性能和低功耗中获益。尽管MP和MT都给软件开发者带来了这种多处理的复杂性,可是当你在这两者之间检查代价和复杂性的折衷因素时,将会发现并非一切都相同。
改变处理的特性
为了不断提高性能,IC设计工程师要为他们的下一代设计研究处理器架构,以提供满足消费者需求的灵活性和可扩展性。如果全新的架构不能沿用传统的软件,就会强烈阻碍在处理器架构中做出任何根本上的变化。计算技术发展历史充斥着此类架构的案例。不论它们的计算性能多么优越,也会因为它们对软件社群的需求和造成的中断而未被采用。
任何到多处理的架构转移都要考虑到这一点,因此必须找到一种方法,针对现有软件的需求,平衡多处理在理论上的可行性。
此外,由于在嵌入式设备中的应用软件和操作系统越来越多地采用并发行为,因而推动了向多处理的转移。这种软件的并发性有助于推进MP或MT(或两者的结合)的应用,以实现下一代嵌入式设备所需要的性能和效率。
多处理器处理和多线程技术
MP和MT两种技术都努力改善处理器的总体性能,并减少任何采用并发软件线程的应用的处理时间。然而,这两种技术在硬件上采用不同的方法来实现这些目标,并因此对于各种特定的软件代码例程,提供了不同程度的成功。
一个普遍的误解认为MP和MT是可相提并论的技术,并且需要相同级别的软件复杂度。只要你看一下其它通用的多处理编程接口,就会发现这两者之间的区别。这表明,程序员必须完全了解他们的多处理解决方案是基于MT、MP还是二者的结合。
高频率处理器访问较慢的存储器会产生一个延迟,该延迟导致执行单元中存在空闲周期,MT的目标就是利用这段空闲周期以增加处理器的总体性能。通过把线程适配到空闲周期中,内核的效率就得到提升。然而,历史已经表明这种多处理实现方法带来的好处还不是很明显。MT本质上是一种单处理器技术,其中只有最小程度的处理器逻辑被复制以支持附加的硬件线程。通常是因为有了程序员的寄存器设置和足够的CPU管理程序状态,操作系统才可能视硬件线程为一个虚拟处理器。
然后处理器逻辑的剩余部分由各线程之间共享,而这会引入一个增加软件复杂度的严重问题。在传统的单处理器上运行两个现有的应用程序,意味着操作系统要在两个应用之间共享处理器资源,通过关联切换(context switch)每秒在两个应用之间交换执行10~100次。
关联切换
正在执行的应用使用保存在处理器寄存器和存储器中的执行状态,这个状态需要与现有的应用交换。在一个MT系统中,当执行单元停止的时候,发生关联切换;关联切换每秒钟可能会发生数十万次。
这种切换程度的极大增加要求在操作系统和MT硬件设计之间仔细协调。必须确保有足够的复制硬件来限制执行状态的保存和再次加载,并确定这不会成为处理器的主要成本。
很少为每个硬件线程进行高速缓存复制。对于软件编写者,这意味着他们要非常清楚更高的关联切换速率对高速缓存以及应用程序带来的影响。
在具有两个独立应用的简单例子中,如果这两个应用只是由操作系统做简单的时间分片的话,MT机执行起来会比单处理器更慢。为了从MT技术获益,软件编写者必须在表达软件线程时非常注意,以使保存在高速缓存中的执行状态在两个线程之间很好地共享。
对于采用MT处理器的应用,这产生了更多的软件复杂度,因为程序员要处理线程对共享的处理器资源的影响。然而,还有一些其它的硬件设计上的问题需要考虑。
多线程硬件
增加硬件线程会导致处理器的复杂度的提高,而没有从根本上改变处理器的微架构,还会影响到设计可以达到的整体峰值时钟速度。复杂度的增加也将增加整体功耗,甚至在执行单线程的时候也是如此。这些MT的复杂度降低了整个应用的性能,即使只有一个应用或一个线程正在运行。
当考虑到所有这些MT的代价相对于有限的性能增加,就很清楚为什么业内越来越多的公司引入双核和多核MP解决方案。MP将一个处理器设计中的大部分复制下来,以从多任务软件中获得最大的性能,而不会引入任何管理共享的处理器资源导致的软件复杂度。
实际上,如果你再次考察在两个独立的处理器上同时执行两个独立应用的案例,会发现总体性能将超过以两倍速度运行的单处理器的翻番的性能。所有操作系统的关联切换和在两个应用之间的所有高速缓存冲突都被消除了,而且每一个应用都能分别以全速持续执行。
对于MP所做的明显假设是:设计的成本要跟硅片面积一样翻番,在把多处理能力添加到嵌入式系统时,MT方法要有效得多。
然而,在任何此类比较中都要考虑总体目标性能要求。采用最新的硅实现技术和高速缓存设计,完全有可能实现MP处理器在相同的硅片面积内提供与MT处理器相同的性能点。但是MP显然具有另外的优势?没有额外的MT软件问题。
多处理要进一步考虑的问题是功耗。MT本质上是一种更为复杂的单处理器,这样就限制了单处理器所有的电源管理需求技术(如时钟门控、待机模式、电压和频率调整等)。
然而,在多处理器设计中,每一个处理器都可以采用这些单处理器技术,还有关闭整个处理器以节省所有耗电的能力。这就使得MP总是给软件提供最大性能,而功耗直接与所完成的任务相关。图1显示了多线程和多内核处理之间的差异。
MT实际上是从差距中获取性能的技术,因为处理器的频率和存储器速度的提升不成比例。显然在这些情形下MT是一种快速修复技术,隐藏了这些不断增长的低效率问题。然而,这样的方式具有有限的寿命和适用性。
这已经由台式机处理器设计所证明,处理器越来越高的时钟速度有一个与功耗相关的硬性极限,而不管其是否支持MT技术。
如果软件具有并发性,更为有效的解决方案可能是直接从单处理器移植到一个可扩展的MP架构。在MP设计考虑了处理器间通信和分布式MP高速缓存间数据共享的影响后,几乎没有另外的相关软件成本。这意味着MP系统可以利用高效的单处理器设计和更佳功效的优势来实现超越MT处理器的性能和功耗的设计点。
可扩展的设计和性能
MP本质上采用的是分而治之的方法,通过把多个处理单元集成在一起,让每一个处理单元能运行一个独立的并发线程,利用模块化设计原理就创建了一个多处理器。
这使得整个设计没有MT这么复杂,风险更低,从而使系统设计工程师能在需要的时候简单地插入另外的处理器。这种设计的简单性使MP比MT的可扩展能力要强得多,因为在MT处理器中与逐渐升高的时钟速度相关的设计成本常常会限制其可扩展能力,特别是当考虑到,因为未命中任意级别的高速缓存而导致重要代价的时候。图2以L2缓存访问为例解释了这种代价。
另一个选择是在单个设计中同时部署MP和MT。然而,已经证实其相关的软件复杂度被现有的多处理器操作系统和软件编写社群严重低估。
在这样的设计中,存在一对基本矛盾,MT需要仔细管理处理器资源的访问和共享,而MP在运行独立应用时具有高效率。许多系统设计工程师发现,实际上在禁用系统的MT后,他们实现了更高的性能。
考虑到许多软件应用可能已经考虑到每种解决方案的特点而为其专门设计,所以笼统地声称一种方案比另一种更好是不明智的。然而,基于传统的单处理器的MP具有更大的可扩展性,所以在选择开发策略的时候,软件设计工程师现在就可以从一定程度的灵活性中获益,他们感到可以为未来一段时间内软件架构不需要变化而放心。