计算机系统结构是一门科学,同时也是一门艺术,它一方面选择如何设计计算机的各部分硬件组件,另一方面,它又非常合理和高效的将这些硬件组件联系在一起,并在硬件层次上,构成一台完整的计算机。
虽然有了一台计算机,但是在科学界完美的计算机是不存在的。但是计算机系统结构的目标是一直不变的,那就是希望能在更小的花销上设计出性能更高、功能更完备、效率更高的计算机。可以看的是,这几乎是一个不可能达到的目标,但是对于在计算机系统结构前沿研究开发的人员来说,可以不断的靠拢这一个目标。
在科研人员的不断探索研究过程中,计算机系统结构一直在朝着功能、性能、效率和花销高度协调的方向发展。从而,计算机系统结构进入了一个,在花销、能量和可用性的控制之下,实现多功能、高性能、高效率的计算机新时代。
虽然众多科研人员都在朝着这一方向不断的努力,但是根据当前计算机系统结构的发展现状,大家同样可以理性的看到一些限制条件,这些限制条件包括设计逻辑上的,同时也包括在硬件层次上的。本文主要综述针对最近三年在ISCA和MICRO会议上发表的数十篇论文,通过仔细研读,深刻理解,我发现这些文章的发表,都是作者在面临计算机系统结构的各种瓶颈时,做出的思考。他们在遇到计算机系统结构现有状态的局限性时,通过调研、分析、研究,给出了相应的意见和可行的解决方案。
可以说计算机的系统结构范围很广,定义也很宽泛,它包含了指令集的设计、组织、硬件与软件的边界问题等等,同时涉及了应用程序、技术、并行性、编程语言、接口、编译、操作系统等很多方面。作为各项技术发展的中心,系统结构一直在不断地朝前发展。
如果去研究计算机系统结构一路发展的历史,不难发现从60年代中期以前,最早的系统结构发展的早期时代,计算机系统的硬件发展很快,通用硬件已经很普遍。从60年代中期到70年代中期,系统结构有了很大进步。多道程序、多用户系统引入了人机交互的新概念,开创了计算机应用的新境界,使硬件和软件的配合上了一个新的层次。从20世纪70年代中期开始,分布式系统开始出现并流行,极大地增加了系统的复杂性,出现了微处理器并获得了广泛应用。如今计算机的系统结构发展已经进入了第四代,硬件和软件得到了极大的综合利用,迅速地从集中的主机环境转变成分布的客户机/服务器(或浏览器/服务器)环境,新的技术不断涌现出来。尽管如此,计算机在总体上、功能上需要解决的问题仍然存在。随着RISC技术、Cache等创新技术的发展,不仅仅在专业领域,越来越多的PC机也在向此靠拢。在每一次进步与创新的同时使组件的成本降到最低成为最需要考虑的问题。
本文以读书报告的形式,从两个点来介绍计算机系统结构方面关于提高性能、增加有效性的一些宏观举措,它们分别是Cache的设计、并行计算的引入,另外一方面通过介绍计算机系统结构中的“可靠架构”来一窥门径。
一、 Cache设计
cache对于学习计算机系统结构的人员来说,肯定不会是一个陌生的字眼。它意味着高速缓冲存储器。它的存在要比主存储器体积小,但是速度快,用于存储从主存储器取出指令的副本(很可能会被下一步处理所用到)。
高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。
Cache主要由三大部分组成:Cache存储体,存放由主存调入的指令与数据块;地址转换部件,建立目录表以实现主存地址到缓存地址的转换;替换部件,在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。
在我看的第一篇论文《Vantage: Scalable andEfficient Fine-Grain Cache Partitioning》中,就提到了可扩展和高效的细粒度缓存分区的技术Vantage。
告诉缓存分区在单芯片多处理器上有着广泛的应用,其中包括从保证服务质量和共享控制到与安全相关的技术。然而现有的告诉缓存分区技术(比如说way-partition)总是被限制在粗粒度的分哦诶上,这样的后果必然回事只能支持少许几个的分区,最后自然会降低告诉缓存的关联性,导致性能的下降。但是现在的计算机系统结构时代正如篇首所说的那样,已经进入一个多核,多处理器、众核、分布式的应用场景,所以粗粒度分配分区,这样的技术,仅仅是适用于2-4个内核,但是对于扩展到几十个芯片的时候,自然是承受不了性能的损失,从而无心应付。
但是作者呈现了一种新的高速缓存分区技术:Vantage。这种高速缓存技术可以克服了以下存在的限制:Cache可以有几十个由于cache粒度而指定大小的分区,同时Cache又可以做到保持高关联性和强大的分区隔离性。Vantage使用缓存阵列,因为缓存阵列具有领好的散列算法和关联性,这会可以做到方便扎牢一整排的高速缓存行。然后Vantage可以通过控制替换流程,从而强制产能分配。
与之前Cache分区的理念不同的是,Vantage提供了严格的隔离保障(比如说可以是90%),但是这不是所有的缓存。Vantage的诞生是由于一些分析模型,这些分析模型允许我们在关联性方面提供强有力的保障,不仅如此,还在边界方面也有同类的保障。从论文中可以看出,这一点其实不难实现,因为只要在百分之二不到的状态开销就可以明显的改观,同样也可以简单的修改高速缓存的控制器。
同样在,在该论文中,作者必然使用了一些实验数据来说明高速缓存细粒度的问题。可以看到Vantage在评估的时候使用了大量的模拟。在32核系统,用350多道程序工作负载和核心的每一个分区,分区的最后一级缓存与传统的技术降低71%的工作量与一个未分区的缓存吞吐量(按7%的平均水平,超过25%的退化),即使在使用64路高速缓存。相比之下,Vantage提高了吞吐量的工作负荷的98%,8%,平均(高达20%),使用一个4路高速缓冲存储器。
可以看出,本篇论文主要提出了Vantage,这个可扩展性好和效率高的细粒度缓存分区技术。它的工作原理是相匹配的插入,通过每个分区的降级率,实现它们的大小大致不变。根据UCP,Vantage在小规模的单芯片多处理器上的性能优于现有的分区方案,但是更为重要的是,它会继续以数十个线程的方式向单芯片多处理器提供利益,但是之前的一些技术都不能做到这一点。
在上一篇论文主要是从缓存分区的角度来体现可扩展性和效率,但是学习计算机系统结构的人员肯定不会把眼光至停留在效率方面,因为在cache上,一致性问题同样重要,如果不解决cache的一致性问题,又或者cache的一致性开销很大的话,那cache的存在也就没有意义。而在论文《Increasing the effectivenessof directory caches by deactivating coherence for private memory blocks》 中,作者讨论了如何通过降低内存私有块一致性,来提高目录式Cache的有效性。
在该文中,作者提到,为了满足需求,更大的高性能共享存储服务器,多处理器系统必须采用高效、可扩展的Cache一致性协议,如基于目录的Cache。基于目录的Cache,正如陈老师所讲的那样,可以在很大程度上解决Cache的一致性,但是随着系统的扩张,系统的Cache大小自然也会越来越大,但是这样会导致一个很严重的问题,那就是结果会导致出现频繁驱逐的目录项。因此,无效的缓存块,会大大降低系统的性能。
从处理器上的cache来看,指定内存块的很大比例只能被一个处理器访问,即使在并行应用程序中也是如此。因此,在这一环节是不需要一致性维护的。但是一旦我们充分利用动态指定那些私有内存块技术的话,我们建议为他们停用一致性协议,同时把他们当成单一的处理器系统。很明显,这样对协议的停用可以使得基于目录的cache忽略跟踪一个适当块的数量,从而降低他们的负载,也增加了他们有效的尺寸。由于操作系统会在私有块的检测上进行协调,所以作者提出的建议只需要做出简单的修改。
在进行了一系列的理论分析之后,作者对该设计进行了充分的模拟仿真。通过模拟结果可以看到,由于论文提出的那个建议,基于目录的cache可以避免跟踪大约75%的访问块,这样可以更好的利用它们本身的容量能力。
首先可以看到的是,这样的情况,逻辑变得更加清晰,因为处理器在这方面的工作量变少了,另一方面,这也有助于并行应用程序缩短运行时间,其中实验表明,这里面可以缩短15%的运行时间,如果保持原来目录式cache块的大小不变的话。但是如果保持系统性能的话,使用小8倍的目录式cache。
看完这一篇论文,我觉得作者的取材点是很值得大家参考的。它只是提出了一个很简单的方法,能使得显著提高目录式cache的有效性。由于私有块不必要使用一致性协议,所以它基于避免跟踪私有块的想法。关于性能提升,前面已经写到的,但是关于恢复机制,我们有必要再谈及。Coherence recovery机制在系统性能上不会有显著的影响,他只是会稍稍的影响到能源的消耗。所以,基于flushing的恢复机制似乎是最合适的选择,因为它提供了类似的性能测试更新。
其实说到cache,不可否认的是,cache的确很大程序上缓解了内存和硬盘访存速度不一致带来的问题。Cache的出现是性能提升的一个关键点,但是随着cache的发展,越来越多可以改进的地方,逐渐被研究人员发现。正是靠着这么多计算机系统结构的从事者,cache正在朝着良性的方向发展。在接下来的一篇论文中,它谈及了独占式末级cache(last-levelcaches LLCs)的旁路算法和插入算法。该论文发表在2011年的国际著名会议ISCA上,论文名为《Bypass and insertionalgorithms for exclusive last-level caches》。
在之前学习多级cache的时候,我们就知道Cache的一个难点是,在Cache满的时候替换掉旧的内容,最简单的策略是LRU策略。在实践中,因为事先不可能知道后面的调用情况,只能实现近似的LRU。有可能会导致某些元素频繁地调进调出Cache。一个明显的改进方案是考虑调用的频率,对于高频的元素,即使一段时间不出现,也不调出Cache。在实现LRU的时候考虑频率是很麻烦的。一种简单的实现方案是,用多级Cache维护频率不同的元素,每层再用LRU。
以上一段为背景情况,而该论文中主要着眼于末级cache(下文简称为LLCs),其中涉及到的是旁路和插入算法。其实关于LLCs,学术界貌似有着众多的想法,因为LLCs是和磁盘交互的最后一级cache,它的存在就像是一条分水岭,可以有很多的策略在这里发挥。比如说2010年ISCA会议上一篇论文《The virtual write queue: coordinating DRAM and last-level cachepolicies》中就提到了使用一个虚拟写队列来实现LLCs和DRAM之间的协调。
可以说广义的LLCs,由于跨级cache块的复制问题,会浪费不少的硅材料。但是随着行业走向cache层次结构的多级化,这个缓存空间,相比于独占式的LLCs,会导致更大的性能损失。可见,LLCs的优点已然很明显,但是这也会出现一个难点,那就是LLCs中替换算法的设计变得更加富有挑战性。然而,在一个普通的LLC中,块可以收集过滤的访问历史信息,这一点在独占式LLCs中是不可能做到的,因为在那之中,块在一次命中后是从LLC重新分配的。所以,这样就会面临一个问题,那就是之前使用最广泛的LRU替换算法和类LRU的替换算法会失效,从而在独占式LLCs中,cache块中合适的插入策略就变得更加关键。另一方面,这种策略没有必要填充每一个块,使得变成一个独占式的LLC。这被称为选择性旁路cache,这在共享式的LLC中是不可能办到的,因为这会违反共享原则。
以上是该论文的思路,从而在建立了设计的思路以后,作者为独占式的LLCs探讨了插入和旁路算法。详细的基于执行的仿真数据表明,最好的插入算法和旁路政策组合对于系统的改善可以达到61.2%,这是一个惊人的数字。几何平均的结果为3.4%,这主要选择在SPEC2006的服务器应用上进行97单线程动态指令跟踪下的每个周期的指令,这样的结果是运行在一个2MB16路的独占式LLC上,比较的对象是,在多流硬件预取前提下的一个独占式设计。相应的改进,在354路多程序运行的16路8 MB共享独占式LLC的工作负载的吞吐量为20.6%(最高)和2.5%(几何平均值)。
总的来说,该论文工作主要是在独占式LLCs方面做出了重要的考查上,其中包括LRU算法和类LRU算法在这方面的失效。随后提出来一系列的设计选择,主要针对选择性的旁路和插入策略。首先是L2 cache和LLC之间块造成的trips数量,第二个属性是在L2 cache中由于未知被块命中的L2 cache次数。最后作者给出了一个最佳的建议,那就是基于trip数量的使用次数的旁路策略和插入算法的结合算法。
二、 并行技术
并行是计算机系统结构中十分重要的概念。并行可以指事件在系统中同时发生的情况。当处理并行问题的时候,通常会有两个非常重要的方面:能够检测并响应以任意顺序出现的外部事件,并确保在要求的时间内做出相应。
在计算机系统结构方面,可以从以下几个方面实现并行:处理机、存储器和流水线等。简单的看来,并行的运用会带来很多好的方面,比如,将工作划分为好几块,从而通过类似于分而治之的思路来完成工作,并行运行从而节省时间开销等,但是并行的引入也会带来一些负面影响,那就是系统的逻辑将变得比以前更复杂,另一方面在功耗方面也会有增加,但是这带来的弊端不会影响科研人员在性能方面的探索,因为一旦追求更高效的系统,自然会在一些模棱两可的方面做出一些取舍。
在我查阅这方面的论文的时候,发现有不少的论文都设计tradeoff的话题,那说明,现在关于并行技术的探讨,不仅仅是一方面的无止尽追求,而是有更多的理性思考,从更合适的角度来选择发展方向,而不是最好的角度。
在这方面问题的探讨很多,其中一篇名为《Exploring thetradeoffs between programmability and efficiency in data-parallel accelerators》 ,主要立足点为数据并行加速器中可编程性和效率的权衡。
在论文中,作者为包括MIMD, vector-SIMD,subword-SIMD, SIMT, and vector-thread (VT)等架构设计模式的数据并行加速器,进行了分类和模块化实施方法。作者已经开发了一个新的VT微系统结构——Maven,该结构主要是基于传统的向量SIMD微系统结构。传统的向量SIMD微体系机构相比之前的VT设计程序,要更容易编码。使用广泛的设计空间探索完整VLSI来实现许多加速器的设计点,可以在MIMD,vector-SIMD和VT模式之间评估可编程性和执行效率之间不同的权衡。而它们共同的试验环境是在微benchmark和编译好的应用内核上。
实验结构发现,vector core比起MIMD core要提供更高的效率,甚至在相当不规则的内核上。他们的实验结构表明,Maven的VT微结构是由于传统的vector SIMD架构,同时提供了更高的率和更便捷的编程。
在读完这篇论文以后,我觉得有效的数据并行加速器必须有效地处理规则和不规则的数据级并行(data-level parallelism),但仍然保留可编程性。作者详细的VLSI结果也证实了这一点,基于矢量的微系统结构在领域和能源上都是比基于标量的微系统结构所需要的更多,即使是处理相当不规则的数据级并行。
在前一篇论文中,我们涉及到了一个概念,那就是数据级并行DLP(data-level parallelism)。与之相类似的还有一个概念,那就是内存级并行MLP(memory-level parallelism)。在论文中《Dynamic warp subdivision forintegrated branch and memory divergence tolerance》中在涉及内存的发散性的时候谈到MLP。在SIMD中取指、译码会在多个处理单元,以最大限度的提高吞吐量,一旦吞吐量下降,步调一致的线程停止是,由于长期延迟的内存访问,产生的空闲周期是极其昂贵的。多线程可以隐藏延迟的多重扭曲交错执行,但是多线程使用的许多warp,会极大程度上由于寄存器文件的存在增加成本,缓存的争用也会导致性能变差。在论文中,介绍了动态warp分支(DWS),允许一个单一的warp占用不止一个的槽,而无需额外的寄存器文件空间。当然这样设计的话,最终的结果就是提高延迟的隐藏和内存级并行(MLP)。使用评估技术的时候,是使用一致的私有式L1 cache和共享式的L2 cache的层次结构。
关于并行技术,广泛的来讲可以延展到很多的方面。
而后,我看的一篇论文《Virtualizing performanceasymmetric multi-core systems》中,着重讲了虚拟化带来的性能变化。
非对称多核的性能是由异构核组成,他们支持相同的ISA,但有不同的计算能力。为了最大限度地提高的不对称多核系统的吞吐量,操作系统负责调度线程不同类型的内核。然而,这种非对称多核系统虚拟化带来了挑战,因为虚拟化的物理客户机隐藏了操作系统的异质性。在这篇论文中,作者探讨了非对称多核上hypervisor调度方面的设计空间,这不需要客户端操作系统的非对称观念。所提出的调度器的效率,使得每一个虚拟核都有效率高的特点,并且将虚拟核都映射到最具有区域效益的物理核上。除了整个系统的吞吐量,我们认为非对称多核虚拟化的两个重要方面是:性能在虚拟机之间的公平性、性能在快速和慢速核上的的可扩展性。
作者不仅在理论上提出了可能性,同时还在Xen的开源模块hypervisor上进行非对称调度器的执行。通过使用运行多种多样特征的应用,可以评估提出的调度器在没有非对称调度器的情况下在提高系统吞吐量上到底有多么有效。修改后的调度器性能的提高高达40%,在一个12个核心系统上跑有四个快速和8个慢核的Xen调度器。结果表明,即使是虚拟机预定缓慢的核有相对低性能下降,但调度器依旧可以通过快速增加核的数量来提供可扩展的性能。
三、 可靠架构
从名称上来讲,可靠架构不是一个具体的专业技术名词,它只是一个统称,它的范畴主要是那些通过改进自身技术或者机制,从而使自身的系统更加可靠的架构。
在计算机系统结构方面,大多数的研究人员希望设计出来的架构或者系统,是经得住信息时代的考验的,所以众多人员从事的科研与可靠架构相关。
在我阅读第一篇关于这方面的论文的时候,我很明显地感受到了计算机系统结构的融会贯通性,因为第一篇论文其中有很大部分是涉及内存一致性的,而一致性问题不仅在这里可以体现,在分布式存储器架构中,同样可以看到一致性原理在设计时候的重要性。
这篇论文名为《Rebound: scalable checkpointing for coherent shared memory》,主要讲述了相关联共享内存的可扩展检查点设置,而作者也将这样的技术称为Rebound,可见作者对其的信心。
该论文中首先讲述了Rebound技术应用领域的一些背景。如今我们的时代正向众核时代转变,被用来为小型共享内存机器服务的基于硬件的全局检查点设置机制变得扩展性不是很良好。而关于扩展性的障碍,主要是包括全局的一些操作,没有响应全局卷回的工作和在不平衡I/O负载的低效率。而可扩展的检查点技术需要跟踪线程间的相互依赖关系,并且建立起检查点,然后在通信着的处理器存在的动态组中执行回滚操作。
这很明显,又是一个计算机系统结构发展到了一定的地步,才出现的一个问题,或者说是原先单核或双核中已经成熟的技术,在应用到多核甚至众核的时候,所遇到的瓶颈问题。而这里的主要着眼点是关联共享内存的检查点设置。
为了解决前面所述说到的扩展性问题,该论文向大家介绍了Rebound技术,这是业界第一个基于硬件的用来协调局部检查点设置的策略,当然这样的设置过程是在多处理器上,并且是使用基于目录的cache一致性协议。Rebound技术补充支持目录协议的事务性来追踪线程间的互相依赖关系。此外,它还通过以下的途径提高了设置检查点的效率:
A. 在检查点延迟将数据写回到安全的内存中
B. 支持含有多个检查点的操作
C. 在屏障同步阶段来优化检查点的设置
Rebound技术介绍了分布式算法中的检查点设置和多处理器的回滚。最多64个线程的并行程序的模拟显示,Rebound的扩展性是良好的,具有非常低的开销。对于64位处理器,相比于全局检查点15%的开销,其平均性能开销仅为2%。
在上面的论文中用到了内存访问延迟这个专业术语,内存访问延迟是指等待对系统内存中存储数据的访问完成是引起的延期。这是一个在计算机系统结构方面非常重要的概念,很多关系到内存的论文机会都会涉及这个话题。比如在《Energy-efficient Mechanisms for Managing Thread Context inThroughput Processors》中,也是在该方面的一个改进和优化。该论文中阐述现代图形处理器单元(GPU)会使用大数量的硬件线程来隐藏功能单元和缓解内存访问延迟。因为极端的多线程需要一个督扎的线程调度器,以及一个很大的寄存器文件,这在能量和延迟的获取上都是及其昂贵的。作者提出了两种互补的技术,来减少在超线程处理器上的能源消耗。其中的一个技术就是设计两个级别的线程调度器,该调度器维护了一部分小的活动线程集合来隐藏ALU和局部的内存访问延迟。
关于提高系统架构可靠的技术还有很多,其中有一种被称为hardwareperformance counters 。在2011年ISCA的一篇论文中,就是使用这种技术来检测需求驱动的软件竞争。该论文名为《Demand-drivensoftware race detection using hardware performance counters》。
动态检测数据的竞争在构建鲁棒的并行程序时是一个重要的机制。软件竞争检测器可以在测试下装备程序,观察每一次内存访问,并监视线程间可能导致并发错误的数据的共享。但是使用hardware performance counters这种方法可以找到平常很难被观察到的竞争,同样的,该方法也会承受很高的运行时间开销。
以上这篇论文提出的技术,是由硬件辅助的需求驱使的竞争检测器。通过该技术,可以检测到cache的各种事件,这些事件表明线程间的数据共享主要是利用现代化商业微处理器上硬件可用的优势。我们使用这个优势来构建一个竞争检测器,使它只有在线程间发生数据共享的时候才被启动。当很小的分享出现的时候,这种需求驱动的分析远远快于如今的连续分析工具,而且不带有大的检测精度丢失。
综上我阅读的十多篇论文可知,它们都是从不同程序提高计算机的性能或者增加计算机系统架构的可靠性,而有一些则是着眼于不很明显的降低计算机的性能或者可靠性的时候,大大降低计算机的成本或者能源开销。这些都是计算机系统结构研究人员重视的研究热点,这也是今后计算机系统结构发展的一个很有前途的方向,同时具有很大的实用价值。
这些论文的立足点都是从简单的概念入手,从而发现问题,提出思考,从而解决问题,而这样的实验方法不仅适用于计算机系统结构方面,其他方面的科学研究也是如此。这也可以告诫自己在以后的科研道路上运用这样的指导思想,为大家展现一副美好的蓝图。
参考文献:(注:在文中亦有标注)
[1].Daniel Sanchez , Christos Kozyrakis ,Vantage: Scalable and Efficient Fine-GrainCache Partitioning ,ISCA2011
[2]. Blas Cuesta, Alberto Ros, María E. Gómez,Increasing the effectiveness of directory caches by deactivatingcoherence for private memory blocks ,ISCA2011
[3]. JayeshGaur, Mainak Chaudhuri, Sreenivas Subramoney,Bypass and insertion algorithmsfor exclusive last-level caches ,ISCA2011
[4]. Thevirtual write queue: coordinating DRAM and last-level cache policie s,ISCA2011
[5]. YunsupLee, Rimas Avizienis, Alex Bishara, Exploring the tradeoffs betweenprogrammability and efficiency in data-parallel accelerators ,ISCA2011
[6]. Dynamicwarp subdivision for integrated branch and memory divergence tolerance ,ISCA2010
[7]. YoungjinKwon, Changdae Kim, Seungryoul Maeng,Virtualizing performance asymmetricmulti-core systems ,ISCA2011
[8]. RishiAgarwal, Pranav Garg, and Josep Torrellas,Rebound: scalable checkpointing forcoherent shared memory ,ISCA2011
[9]. MarkGebhart , Daniel R. Johnson and so on ,Energy-efficient Mechanisms for ManagingThread Context in Throughput Processors ,ISCA2011
[10]. Demand-drivensoftware race detection using hardware performance counters,ISCA2011