从2001 到2020:体系结构发展的新趋势
最近十年微处理器的发展有了许多新的方向,这一方面是新兴应用负载所驱动的,另一方面,也是因为dark silicon 暗硅的存在人们无法充分利用十亿级别的晶体管。文献[60, 61] 指出了未来的一些发展方向,包括Energy and efficiency,Safety and security 和Parallelism and memory。可见人们对于微处理器的研究方向逐渐发生了变化,其中一个重要的问题就是功耗。晶体管尺寸越做越小,漏电电流却逐渐增大,芯片的热量快要把自己给烧掉了。为了解决功耗的问题,许多方法被提出,但也引发了新的问题。
功耗
Bulldozer 是AMD 在2011 年推出的微处理器架构,意图对Intel 发起绝地反击。但可惜的是,尽管架构设计理论更先进,但在实际操作时由于浮点性能不足,无法和Intel 正面抗衡,只能通过其他方面的努力艰难维持市场份额。最新的Zen 架构改掉了此前设计的不合理之处,再次赢得了消费者的喜爱。
Bulldozer 采用模块化的设计方案,可以方便的设计、生产和组装,同时也能更方便的管理功耗[45]。由于采用了模块化的设计思路,AMD 的架构师可以针对不同的应用场景快速构建合适的微处理器架构。Bulldozer在一个微处理器当中集成了两个定点核心,以支持多线程操作;但两个线程又共享同一个浮点部件,导致浮点性能不佳。前端被两个线程共享,可以同时执行4 条指令的译码。完成译码的指令被划分为调度组,每个组中所有的指令仅属于同一个线程。浮点运算部件支持FMA 乘加指令,专用的乘加部件几乎成了微处理器架构的标准设计,用来加速可能常见的浮点操作。面对市场的需求,许多技术手段被用来降低功耗,例如filtering,speculation reduction,和data movement minimization 等技术,并且可以根据微处理器的活跃程度动态管理功耗。通过基于事件的监控和主动调节工作功率,使得处理器尽可能的工作在设计功率上,并且尽可能的提升性能。
Intel 的Haswell 架构是第二轮Tik-Tok 战略的产物,是Core 系列的第四代产品。从第二代Sandy Bridge[42] 到第四代Haswell[43] 再到第六代Skylake[44],除了常规的升级外微处理器的微架构基本保持不变[62],重点一直在功耗控制、图形处理和超频技术上。
Sandy Bridge 引入了Package Control Unit(PCU) 作为功耗控制的中心,利用深入到每个功能部件的power management agents(PMAs) 收集信息,并配合外围供电控制器voltage regulator module (VRM) 对微处理器进行P 状态和C 状态的切换。需要重点关注的功能部件包括微处理器核、互连Ring、Cache 以及图形处理单元GPU,通过算法控制各个部件之间平衡,避免高频空转现象。这里存在两个问题,一是在高性能的P 状态和低功耗的C 状态之间切换会存在一定的延迟,另一方面这样的切换同样也是消耗能量的。Sandy Bridge 使用Demotion 算法来解决这些问题。
Haswell 使用更为复杂的三类功耗控制技术:底层实现、高层架构和平台功耗管理。底层实现包括:优化电路和制造工艺,优化微体系结构和算法,关注那些未使用的逻辑电路。高层架构基本与Sandy Bridge 的PCU 保持一致。平台功耗管理层面进一步改进进入C 状态的延迟,并且可以进入更深的C 状态,并增加了新的S0ix 状态提高移动端的电池寿命。此外,Haswell 将前代的电压控制器集成为新的Fully integrated voltage regulator(FIVR),更加统一和高效的完成电压控制的工作。
Skylake 进一步升级功耗管理技术,称之为Intel Speed Shift technology。CPU 全面负责功耗、性能和能效,比OS 层面的监控具有更细的粒度、更快的响应时间和更多的架构可见性,使得消费者-生产者类型的工作负载的线程依赖性的可观察性得到了改善。PMU 作为性能监控模块,在虚拟化、原子界面和共享资源等方面得到了加强。
安全
计算机体系结构安全今年来也收到了极大的关注[63],体系结构方面的安全漏洞造成的损失往往较大,而且不易修补。一直以来,体系结构的设计目标是提升性能、降低功耗、缩小芯片面积,但也正是这些方面的努力导致了相关的漏洞。
针对DRAM 的攻击,例如Cold-Boot 和Rowhammer。Cold-Boot[64] 利用DRAM 缓慢掉电的特性,对DRAM 进行物理冷却进而dump 其中的数据。解决方案是对DRAM 进行强制擦除。Rowhammer[65] 利用的DRAM 的物理干扰问题:某一行的数据如果重复写入,会导致相邻行的数据被翻转。该问题由于制造方式的不同在不同的DRAM 上表现不同。解决方法是使用带有ECC 校验的DRAM。
针对推测执行的攻击,例如Meltdown 和Spectre. “熔断”[66] 在一条引起trap 的指令后面执行一条访存指令,该访存指令将获取本来只能操作系统访问的地址区域。尽管访存指令随后会被取消,但是相关的数据已经被加载进Cache 当中,随后攻击者通过Cache 侧信道的手段获取数据。通过该漏洞,攻击者可以获取由操作系统保护的数据。一种解决方法是在尽早执行特权级检查,或者像AMD 一样,在访存之前进行检查。而面对“幽灵”漏洞,Intel、AMD、ARM 等厂商几乎全军覆没。“幽灵”[67] 利用微处理器共享分支预测器的特征,在和目标代码相同的位置处设置分支方向相反的指令,使得目标代码被误预测执行。同样,随后的访存指令尽管会被取消,但是数据仍会被加载进Cache,再利用Cache 侧信道的攻击手段,攻击者可以获得目标进程的数据。面对“幽灵”似乎硬件方法代价太大,不管是使用分离的分支预测器还是每个处理器仅运行单一进程。软件层面上可以通过在相关的位置插入内存栅障指令或是顺序访存指令,禁止微处理器的推测执行。
为了降低功耗,人们发明了DVFS 技术。但不幸的是,不协调的电压变化可能使得微处理器的时钟被恶意篡改,进而引发安全问题[68–70]。
新兴负载、专业化加速器和芯片便捷开发
过去十年里出现了许多新兴负载,例如视频编解码、游戏、比特币挖矿和人工智能算法。CPU 作为通用处理器当然可以运行这些程序,但是为了进一步提高专一领域的性能和能效,出现专业化定制芯片的需求,例如GPU、TPU 和比特币专用芯片。文献[71] 收集了大量相关领域的专用芯片,考虑在专用芯片性能提升背后,除了工艺进步等方面真正属于专业化带来的性能和能效提升有多少。通过比较发现,在领域新兴之时,架构师们还处在摸索阶段,确确实实有专业化带来的性能和功耗提升。但是随着领域逐渐成熟,专业化的收益逐渐持平,更多的收益来自于更多的晶体管和更好的半导体工艺。另一方面,摩尔定律接近尾声,也就不难预测专用加速器所能达到的性能和功耗极限,也就是加速器墙。
近几年人工智能领域发展火热,也有文献[72] 专门讨论在图分析领域的内存负载情况。对于图来说,非常常见的一种访问方式就是读取一个节点的邻居列表,然后访问他们的邻居。表现在访存行为上,就是两次连续的Load 操作之间有依赖关系,无法充分利用访存的局部性。同时他们发现,许多经典的图分析算法对L2 Cache 几乎不敏感,导致其利用率很低。在此基础上,文中提出使用L2 Cache 作为数据预取的存放地点,利用数据的类型信息做预取。其实这给我们新的预取思路:能否设计一条访存指令,访问一个内存地址,按照其中存储的内容再次访存取回所需要的数据。
新兴负载属于应用驱动的芯片设计,为了缩短芯片开发周期,便捷开发的设计思想被提出,这里不展开叙述了。
多核微处理器和片上网络
在微处理器核已经设计完成的情况下还想要进一步提升微处理器的性能应该怎么办呢?答案似乎是显而易见的,连接多个微处理器核来提供近似线性的加速比。从程序员的角度来说,这样的系统内存共享编写程序会比较方便,不需要太多的更改。而从性能的角度来说,这意味着互联技术很大程度上影响了系统的通信能力。如果微处理器核在片上互连,这就是片上多处理器,目前大多数桌面级微处理器都采用这种模式;如果微处理器之间能够通过PCIE 或是专用接口快速互连,大多数服务器会采用这种方式;如果更多的服务器以更为密集的形式通过专用网络进行互连,就成了目前数据中心的样貌。
我们来看片上网络(Networks on Chip,NoC)。片上网络要求高带宽、低延迟,同时鲁棒性高并且功耗低。为了解决这些问题,强化学习的方法被引入了进来[73]。架构师们首先设计了不同的路由策略和冗余通路,并由控制器进行控制,而控制策略则是由强化学习的方法训练得到的。
并行计算机和Cache 一致性
高性能的微处理器提供基本的运算资源块,高性能的互连技术提供快速的通信网络,其中还有一类技术用来提高被动通信的性能,Cache 一致性协议。由于现代的微处理器内部普遍使用了Cache 技术,当数据被取进Cache 当中并且被微处理器修改,如果修改后的值不能及时的被其他微处理器看到,就会导致数据的不一致。最为简单粗暴的方法就是每次写操作都向系统中所有的微处理器广播,这其中显然有大量的无用通信。高效的解决这一问题的方法就是Cache 一致性协议,有关的方法被总结在文献[74, 75] 中。许多微处理器在设计时都有这方面的考虑,前面介绍过的AMD Opteron[35, 59]、Intel Haswell[43]、IBM Power4[32] 中都有或多或少的描述。
从方法上来说,维护一致性策略主要有基于监听的方法和基于目录的方法两种两大类。基于监听的方法使用总线快速广播事务,Cache 控制器根据Cache 中的实际内容作出相应的动作。这样的好处在于实现简单,不需要大量的额外开销,坏处是可扩展性较差,适用于小规模并行机。而基于广播的方法则使用专门的目录记录数据的大致分布,通过发送点对点的消息定向完成操作。这样的好处在于通信量小,系统可扩展性好。不管使用哪类协议,都需要专门维护Cache 的状态,例如最简单的MSI 三状态,或是标准的MOESI 五状态,IBM 的Power7[46] 则使用了十几种状态。适当划分Cache 的状态可以对其采取更有针对性的措施减少延迟,但同时也伴随着更复杂的硬件设计。除此之外,还有一些设计细节需要在实践中打磨。接下来看一个例子,SGI Origin[47] 具体是如何实现的。
SGI Origin 是1997 年推出的高可扩展的ccNUMA 架构的大型服务器,最多支持1024 个MIPS R10000微处理器互连。设计目标包括三点:1. 可扩展性,要支持超过36 个微处理器;2. 易于编程,支持共享内存模型;3. 性价比高。要达到这样的目标,基于监听协议的总线式结构自然无法满足要求,因此设计采用目录协议维护一致性。SGI Origin 支持至多512 个节点互连,其中每个节点包含两个R10000 微处理器和至多4GB 的内存,同时还集成有目录存储和总线控制器。互连结构可以使用任意可扩展的互联网络,也并不要求顺序的点对点通信,使用两条虚拟链路来避免死锁。Cache 一致性协议支持更新和写无效事务,Cache 行可以被静默替换。目录在小规模时采用16 位向量模式,而在系统规模较大时采用64 位稀疏向量。Cache 状态增加了CEX 状态,表示Cache 行是独占的并且是未被写过的。除了Cache,TLB 同样需要维护,这方面的技术包括TLB 中毒和击落。除了LL/SC 之类,系统还提供fetch-and-op 原子操作提升性能。有关如何建造并行计算机的方法,教科书[33] 中有详细的描述,感兴趣的读者可以找来深入阅读。
数据中心和虚拟化
虚拟化技术是近年来的热门话题。不管是纯用户层面的二进制翻译技术,例如Qemu 和VMware,还是修改操作系统代码的Xen 技术[76],还是利用硬件辅助完成虚拟化的KVM 技术[77] 和VMware ESX[78],都试图尽可能的提高虚拟化的效率。为了从硬件上提供虚拟化的支持,Intel 提出了自己的硬件虚拟化技术[79]。软硬件协同的虚拟化技术往往能提供更好的效果和效率。
数据中心为了数据安全,会对数据进行多副本容灾,或者为了让数据尽可能的靠近用户提高用户体验,会将数据从数据中心迁移到某个服务器。这就导致了一个问题:如何维护多个数据副本之间的一致性。解决这个问题的过程中诞生了一些重大的理论成果,例如CAP 理论[80]。该理论是说,在一个多副本的环境下,百分百的C(Coherence,一致性)、百分百的A(Availability,可用性)和百分百的P(Network Partition网络分区)是无法同时达到的。面对这样的问题如何去权衡和设计分布式系统成了计算机领域的一大难题。不管是云计算服务还是云存储服务[81–85],都需要在这个问题费点心思。2008 年的Bitcoin[86] 或许给出了这个问题的另一个答案。