【读论文】同步多线程:最大化片上并行度

Simultaneous Multithreading: Maximizing On-Chip Parallelism
同步多线程(simultaneous multithreading, SMT)(原文都是用SM作为缩写,但是网上公认的缩写似乎是SMT?)是一种在一个时钟周期内允许多个独立线程同时向一个超标量处理器的多个功能单元发射指令的技术(e.g. Intel超线程技术,不过这是后话了,本文发表于1995年)。文章提出了多种同步多线程模型,并与超标量、细粒度多线程处理器和多发射多核处理器对比,在充分利用处理器资源上展现出了很强的潜力。此外,同步多线程也对处理器设计增加了大量复杂度。
Introduction
前面已经提到SMT允许一个周期内不同线程独立向多个功能单元发射指令,而这种线程与功能单元的绑定关系是完全动态的。SMT的目标是在面临高内存延迟和有限的线程并行性下大幅提高处理器利用率。因此SM结合了超标量处理器的多发射特性以及多线程体系结构延迟隐藏的能力。
现有的微处理器应用了许多增加并行性和资源利用率的技术,但都存在较大的局限性。如超标量处理器(e.g. DEC Alpha 21164, MIPS R10000)一个线程在一个周期内最多发射4个指令。(为什么不多发射几个指令以提高性能呢,是因为不喜欢吗?)受限于线程的指令间依赖和高指令延迟,难以继续提高指令发射数。这些限制可以被定义为图1所示的发射槽的水平浪费和垂直浪费,前者指一个时钟周期内的指令发射槽未满,后者指时钟周期间的阻塞。另一方面,多线程体系结构(e.g. HEP, Tera)支持线程的快速上下文切换,能够隐藏访存延迟和功能单元延迟,缓解了垂直浪费。但任意一个周期内只能由一个线程发射指令,且不能充分利用处理器发射宽度的提高。相比之下,SMT可以很好地解决水平浪费和垂直浪费问题。实验结果显示,SMT在一定的处理器发射带宽下,能够显著提高指令吞吐量。

Methodology
由于尚没有处理器支持SMT,文章在模拟环境中定义了一个SMT体系结构的实现,这个实现基于下一代的超标量处理器。
Simulation Environment
模拟环境使用了指令集层的仿真,并支持部分解码指令的缓存以加速仿真。模拟器建模了流水线、内存层级(包括命中率和带宽)、TLB和带分支预测的超标量处理器。模拟器的参数基于Alpha AXP 21164,并根据多线程执行的需要进行了一些修改,如图所示。模拟器设置了10个功能单元(4个整数、2个浮点、3个读写、1个分支)和最高每个周期8发射,假定所有功能单元都是完全流水线的。此外,模拟器还假定L1和L2缓存稍大,由于多线程会增大缓存的需求,并且预计当支持SMT的处理器出现时,缓存容量也会随之发展(简称贷款())。


模拟器支持有限的动态执行:无依赖的指令会被顺序发射到每个线程8指令的调度窗口,并被乱序调度至功能单元,而由于功能单元不可用未被调度的指令在下一个时钟周期中有优先权。发射模型使用了Multiflow追踪调度编译器的静态调度技术,虽然不是完全的动态执行,但也因此显著降低了设计复杂度(e.g. 无寄存器重命名除非需要精确中断,使用了每个寄存器1位的简单计分板算法)。模拟器使用了具有2048个直接映射条目的2位分支预测历史表,12个条目的返回栈预测返回地址,32个条目的跳转表模拟Alpha处理器的跳转地址计算。模拟器最高支持8个硬件上下文,支持多种多线程模型,包括严格优先级调度策略和公平策略。其中,不同调度策略的指令吞吐量几乎相同,只是线程间的相对速度不同。
Workload
工作负载使用了SPEC92基准测试套件。为测量原始指令吞吐量,令每个线程运行一个单线程应用,排除同步延迟和低效并行实现的影响。单线程实验时使用default数据集。多线程实验时改变SPEC应用运行优先级,重复实验。
Superscalar Bottlenecks: Where Have All the Cycles Gone?
为什么要提出SMT呢?动机还是在于当时流行的超标量处理器有太多局限性。作者使用只有一个硬件上下文的基准超标量处理器测试SPEC套件中指令发射槽的利用率,分析导致空发射槽的原因,并提出可能隐藏或减少延迟的技术。


如图所示,超标量处理器平均利用率只有19%。浪费发射带宽的最大因素是占37%的短浮点延迟(即由于浮点运算导致的指令发射延迟),其余因素占比也十分可观,并且很多因素可能存在重叠。即便存储延迟完全消除,也无法达到40%的利用率,必须要依靠通用的延迟隐藏方案,例如多线程。如果按发射槽的水平和垂直浪费分类,大约61%为垂直浪费,其余为水平浪费。传统的多线程技术可以部分消除前者,但由于单线程难以填满每个时钟周期的所有发射槽,反而会增加后者(为啥会增加水平浪费呢orz);而SMT有潜力同时优化。
Simultaneous Multithreading
The Machine Models
文章介绍了多种多线程超标量处理器的模型用于性能测试。细粒度多线程(Fine-Grain Multithreading )每个周期只有一个线程可以发射指令;同步多线程全发射(SM:Full Simultaneous Issue )中所有的8个线程同时竞争指令发射槽,硬件复杂度最高,但展示了SM的性能潜力;同步多线程单发射(SM:Single Issue)、双发射(SM:Dual Issue)和四发射(SM:Four Issue)则限制了每个周期每个线程发射的最大指令数;同步多线程限制连接(SM:Limited Connection )令每个硬件上下文连接到每种各一个功能单元,但功能单元对线程仍然是共享的。下表总结了不同设计对硬件实现复杂度的影响。总体来说,指令间依赖检查、寄存器端口、前递逻辑的复杂度主要受发射带宽和功能单元数量的影响,而非支持的线程数。

The Performance of Simultaneous Multithreading

上图显示了对于不同多线程模型,执行线程数对平均每时钟周期发射的指令数(IPC)的影响。细粒度多线程体系结构只能对IPC提供最高2.1的加速比,事实上,在4个线程的情况下,已经将垂直浪费降至了3%,无法随线程数增加而继续获益。相比之下,SMT的几种多线程模型可以消除水平浪费,针对IPC的加速比最高为4.2,达到6.3IPC。此外,SMT模型的优秀性能使得硬件上下文数与硬件复杂度的权衡成为可能:4个硬件上下文的同步多线程双发射与6个硬件上下文的单发射有着相当的性能。
不过,随着处理器利用率的提高SMT线程间的共享资源抢占愈发显著,包括发射槽、功能单元、缓存、TLB等。8个线程同时运行使得优先级最低的线程只能以优先级最高的线程55%的速度运行,而后者相比单线程运行时的速度也降低了35%。另外,随着多线程局部性的下降,缓存压力也显著增大,由缓存不命中和TLB不命中导致的时钟周期浪费显著提高。需要指出的是,经过实验,缓存大小并不会影响IPC在不同线程下的加速比。
Cache Design for a Simultaneous Multithreaded Processor
之前的实验显示SMT的共享缓存带来了性能下降,因此进行进一步实验,使用8线程4发射模型聚焦于L1 缓存的不同组织方式:线程私有和共享(假定L2和L3缓存均为线程共享)。
如图所示展示了实验结果,其中图例的含义为[L1指令缓存容量(KB)][私有或共享].[L1数据缓存容量][私有或共享]。实验结果显示,共享缓存在线程较少时最优,而线程私有的缓存在线程较多时更优。值得注意的是,对于数据缓存,共享的总是优于线程私有的,而线程私有的指令缓存在8个线程时优于共享的。这是由于共享的数据缓存支持线程同时对多个内存块读写,而指令缓存只存在单纯的访问冲突。综上所述,64s.64s和64p.64s成为了L1缓存的最佳组织方式。前者在线程较少时性能优秀,而线程较多时也与其它方案相差不大,此外共享缓存不需要额外的硬件以维护缓存一致性;而后者在所有线程情况下都保持着次优及以上的表现。

Simultaneous Multithreading versus Single-Chip Multiprocessing
随着芯片密度不断提高,多核处理器(MP)已经成为了另一种提高并行能力的重要方式。文章也比较了同步多线程和小规模单芯片的多核处理器,二者均有着多个寄存器堆和功能单元,主要区别在于不同的调度和资源划分方式。鉴于SMT和MP很难控制变量,实验控制了二者大部分配置相同,而在部分配置上更倾向于MP。不过作者也指出,SMT的设置可能存在两方面的乐观假设:指令调度时间和共享缓存访问时间。基于Alpha处理器的配置使得模拟器的指令调度和发射是完全流水线的,而SMT的复杂调度可能使其额外消耗一个流水线阶段,导致指令预测失败。但实验证明,即便如此对IPC的影响也不会超过1%。相比之下,共享缓存的访问时间影响更大,由于SMT中缓存与读写单元均为共享的,二者的距离较MP更远,访问时间会增加。通过设置SMT中线程私有缓存与读写单元,可以消除这个影响;实验显示,即便在这种情况下,SMT也能达到比MP更优的性能。

实验A、B、C测试了SMT和MP在拥有充足的功能单元时的指令吞吐量;实验D与实验A相同,但减少了SMT的功能单元数量;实验E、F中MP有着更高的总发射带宽;实验G比较累SMT和MP在受限的功能单元数量下的吞吐量。实验结果表明SMT在更小的发射带宽或更少的功能单元的情况下,指令吞吐量均优于MP。此外,SMT的优势还在于:1)线程数较少时更高的利用率(MP会有核心空闲);2)硬件设计的细粒度和灵活性,MP必须为所有核心同时增加部件才能提高性能(大小核不好搞啊!),而SMT增加的部件可以被所有线程共享。
参考文献
[1] TULLSEN D M, EGGERS S J, LEVY H M. Simultaneous Multithreading: Maximizing On-Chip Parallelism[J].

现在SMT(或者叫Hyper-Threading)已经很普遍了,并且和文章提到的对手MP结合在一起,不过一般是1个物理核心对应2个逻辑核心,甚至有的处理器不支持SMT。这是不是说明SMT其实并没有文章里吹的那么好,不太懂。虽然不是我的专业方向,不过这种文章读着还挺有意思的,以后有时间看看后续工作(什么先看结局再补剧情)。