全部博文(436)
分类: LINUX
2013-02-02 13:32:12
SMT将处理器带入新时代? 此文摘抄自 杨剑新 发表于计算机世界网
多线程技术获得大众广泛关注源于Intel。在其新一代基于奔腾4的Xeon处理器中,Intel使用了Hyperthreading技术,而这一技术的核心就是同时多线程。几乎与此同时,IBM也宣布,将于2004年推出其下一代具备“同时多线程”能力的64位处理器——Power 5。其实,高性能处理器的先锋Alpha早就决定在Alpha 21464(EV8)中采用“同时多线程”结构了。要不是由于某些非技术的原因,在今年年底我们就能看到这款64位同时多线程处理器了。
众多主流处理器厂商将其新一代高端产品的结构定为“同时多线程”(SMT——Simultaneous Multithreading),绝非偶然。
当许多人还在讨论“EPIC”是否真的比“RISC”或“CISC”更好的时候,我们不妨从更深的层次上,了解这种前途光明的处理器结构。因为,许多人认为同时多线程处理器时代已经离我们不远了。
别让发射槽闲着
超标量技术和多线程技术的结合,产生了SMT,从而让处理器资源得到充分利用,也让处理器性能得到提高。
在过去的20多年中,为了提高性能,处理器结构不断发生变化。最简单的标量处理器在一个时钟周期内最多发射一条指令,而指令间又存在着某种相关性。这些相关性表现在三个方面:一是由于使用同一功能部件造成的结构相关;二是访问同一寄存器或同一存储器单元而产生的逻辑相关;三是由于转移指令所造成的控制相关。指令的相关性导致在一些时钟周期内,无法发射指令(如图1(a))。因此,这种结构的IPC(instruction per cycle)实际上小于1。
为了提高IPC,产生了多发射技术,其中最常用的就是“超标量”。这类处理器每个时钟周期可以给不同的功能部件发射多条指令。为了减少指令间的相关性对性能产生的不良影响,在超标量处理器中,采用了乱序执行、寄存器重命名和分支预测技术。但仍然无法完全消除相关,造成在一个时钟周期内可能没有足够的可发射指令来填满所有的发射槽,有的时钟周期内甚至可能出现没有指令可以发射的情况(如图1(b)),空闲的发射槽将被白白浪费。在多处理机系统中,远程访问延迟所造成的性能损失就更大了。因此一个4发射的处理器的IPC一般只略大于2,而且如不采用其他技术,对于一个m发射的超标量处理器来说,当m > 4时,随着m的增加,IPC的增幅将迅速降低。为此,必须通过其他方式来提高处理器的性能。
多线程处理器便是一个很好的尝试。多线程处理器对线程的调度与传统意义上由操作系统负责的线程调度是有区别的。
它完全由处理器硬件负责线程间的切换。由于采用了大量的硬件支持,线程的切换甚至可以在一个时钟周期内完成。在一个细粒度多线程处理器中,每个时钟周期都从一个不同的线程中选择指令,并发射到相应的功能部件中。由于不同线程的指令间不存在相关性,因此可以保证每个时钟周期都有指令可以发射。即使某条指令有很长的访存延迟,多个线程的切换运行也可以有效地隐藏延迟。但是,在采用多线程技术的超标量处理器中,同一时钟周期内执行的还是同一线程的指令,仍然存在相关性,因此仍然有一些发射槽被浪费(如图1(c))。那么还有没有更好的处理器结构呢?当然有!那就是同时多线程。
同时多线程技术是超标量技术与多线程技术的完美结合。它允许指令发射部件每一时钟周期都可以从多个线程中选择多条不相关的指令,发射到相应的功能部件中去执行。同时多线程处理器完全有能力每个时钟周期都填满所有的发射槽,而不产生任何浪费(如图1(d))。由此可以看出,多线程处理器在性能方面的优势是不言而喻的。
减少相关性就是提高性能
SMT无疑是处理器结构方面一次不小的突破。在其他处理器结构中,许多想尽办法也无法解决的难题,在同时多线程结构中却很容易解决。这一技术的优势就体现在它具备解决影响处理器性能的诸多难题的能力,如减少相关性。
(1) 减少结构相关对性能的影响
当某条指令由于使用的功能部件被前面的指令所占用而无法执行时,这两条指令就发生了功能部件冲突,我们称这样的指令之间存在结构相关性。超标量处理器中使用了计分板(scoreboard)或Tomasulo机制来支持指令的乱序执行。其原理是:
当某条指令由于功能部件冲突而无法执行时,其后继的无结构相关的指令可以先被执行。同时多线程处理器不但支持乱序执行,而且其采用的同时从多个不同线程中选择指令的方式,还大大减少了指令间出现功能部件冲突的概率,也就进一步减少了结构相关产生的危害。
(2) 减少逻辑相关对性能的影响
为了消除寄存器的“读后写”和“写后写”相关,也就是所谓的“伪相关”,超标量处理器的寄存器文件中物理寄存器数目都大于程序员所能看到的逻辑寄存器数,并采取了相应的“寄存器重命名”策略。但对于“写后读”相关,也就是所谓的“真相关”,超标量处理器却无法解决。
在同时多线程处理器中,为了在线程切换过程中快速保存和恢复现场,每个线程都配备了独立的寄存器文件,只要选择不同线程的指令就不存在寄存器的“写后读”相关。当再次调度到同一线程时,即使下一条指令与前面的指令存在“写后读”相关,前面的指令也已经执行完毕,相关性危害也就不存在了。同时,对于每个线程,同样采用寄存器重命名技术来消除伪相关。因此,同时多线程处理器有能力消除各种由于寄存器相关而产生的危害。
对于访问同一存储器单元的指令,传统的方式是通过编译器优化,将前一条指令的前驱指令或后一条指令的后继指令插入到这两条指令中间,拉大这两条指令的间距,以期减少此类相关引起的危害。但编译器找不到合适的插入指令的情况并不少见。而同时多线程处理器可以通过切换线程的方式,近一步增大这类指令的间隔,减少访存地址相关的危害。
(3) 减少控制相关对性能的影响
当执行到转移指令时,只有等到它执行完毕才能准确得知后继指令的地址。如果不采取措施,在等待转移指令执行结果的这段时间里,后继指令将无法执行,造成指令流水线的闲置。在超标量处理器中通常采用转移预测技术,预测可能的转移方向,并按照这一方向继续执行。当转移地址确定后,如果与预测方向相同,则确认推测执行的结果;如果与预测方向不同,则在转移指令之后被发射的所有指令将作废,并从正确的转移地址处开始执行。因此,转移预测的正确率就显得非常重要了。现在的转移预测技术的正确率可以达到85%~95%,对于特定作业甚至可以高达99%以上。但随着处理器一个时钟周期内发射指令条数和指令流水线级数的增加,处理器中处于in-flighting状态的指令数目也迅速增加。一旦预测失败,作废的指令条数也就增加了。
同时多线程技术的出现,为减少预测失败提供了一条新的途径。它将分支的两个转移方向映射到不同的线程中,同时执行,等转移地址确定后,从两个线程中选取正确的一个继续执行,错误的线程将被中止。虽然废止错误的线程会损失一些效率,但由于存在多个同时运行的线程,因此不会出现所有in-flighting指令都被作废的情况。虽然单独使用这一技术来处理转移指令,效率并不高,但是将这一方法与传统的转移预测技术相结合,则会进一步减少控制相关所产生的危害。
(4)隐藏远程访问和同步等待延迟
在大规模并行计算机系统,特别是拥有数千个处理器节点的DSP系统(分布共享处理器系统)中,处理器访问远程存储空间的延迟可以高达200多个时钟周期。同样在如此大的系统中,多个节点间的同步等待延迟也不容忽视。传统处理器通过忙等待(busy waiting),或一个耗时很长的操作系统级线程切换来处理此类情况,随着高性能计算对系统效率要求的不断提高,这样的处理方式已经不能满足要求了。
操作系统级线程切换所消耗的时间开销可能比访存延迟造成的损失还要大。而同时多线程处理器中由硬件支持的快速线程切换机制,几乎可以做到“零时间开销”。因此,同时多线程处理器可以通过线程切换,在一个任务进行远程访问和同步等待过程中,运行其他任务的线程,将延迟有效地隐藏起来。