关注我们 设为星标

EETOP

百万芯片工程师专业技术论坛

官方微信号



多年来,处理器的设计重心一直放在性能上,而这种性能几乎无需对其他任何因素负责。性能如今依然重要,但它必须开始对功耗负责。

如果性能的小幅提升伴随着功耗的不成比例增长,设计人员可能需要放弃这类改进,转而选择能效更高的方案。尽管当前架构在性能和功耗优化方面稳步推进,但进一步提升正变得越来越困难。

所有人都在重新设计微架构,研究如何改进以控制功耗,” 铿腾电子(CadenceTensilica 音频 语音 DSP 产品营销总监普拉卡什・马德瓦帕西(Prakash Madhvapathy)表示。

许多旨在提高计算吞吐量的处理器特性(如乱序执行)会增加复杂电路,进而导致功耗和电路面积上升。如今,由于功耗成本问题,这类改进很可能不会被接受。那么,在当前的处理器架构中,还有哪些机会呢?

高效的实现还不够

许多提升能效的努力都涉及对现有架构的优化设计,这方面仍有一些提升空间。在实现层面,有很多节能技术,” Ansys已被Synopsys收购产品营销总监马克・斯温嫩(Marc Swinnen)说。

一种非常基础的方法是利用制程改进,用更少的功耗完成更多工作。摩尔定律并未消亡,” 斯温嫩表示,我们仍在推出更先进的小尺寸制程技术,而这一直是降低功耗的首要方式。它或许很快会走到尽头,但目前还没到那一步。

这也会影响制程节点的选择。选择特定制程节点时,也需要考虑能效,” 马德瓦帕西说,“22nm 本质上是 28nm 的改进版,能效特性要好得多。” 他指出,12nm 是另一个常用于高能效设计的热门节点。

3D 集成电路(3D-ICs)提供了一种介于单芯片和 PCB 级组装之间的新功耗平衡点。“3D-IC 的功耗会高于单芯片,但相比通过传统 PCB 布线连接的多芯片方案,3D-IC 的功耗更低、速度更快,” 斯温嫩指出。

共封装光学(CPO)技术将光学元件与硅片更紧密地结合,这也能降低功耗,但它的普及之路漫长。“CPO 早已存在,但由于技术复杂性带来的经济成本难以合理化,最终的权衡往往并不划算,” 斯温嫩解释道,不过这种情况似乎正在改变。一方面是技术有所进步,另一方面是高速数字通信的需求变得极为迫切,人们愿意为此支付更高成本。

并非所有技术都切实可行

有些实现技术听起来很有趣,但也存在自身挑战。异步设计就是其中之一。从积极方面看,每个寄存器都能以最快速度与下一个寄存器通信,” 斯温嫩解释道,没有中央时钟,整个时钟架构都可以省去。也不存在‘ slack ’(即一条数据路径等待另一条数据路径的情况)。尽管异步设计已有数十年历史,但(除特定场景外)始终未能普及,因为其性能不可预测。时序如何完全是个未知数,而且由于制程差异,每颗芯片的表现可能都略有不同。

最终它是否真的能节省功耗也不明确。自定时握手意味着触发器必须设计得复杂得多,” 斯温嫩说,综合来看,所有触发器的功耗反而更高。而且有个问题始终存在:付出这么多复杂性和牺牲可预测性后,真的能节省多少功耗?结果是,它并未成为一种主流设计方法。

虚假功耗(或毛刺功耗)也可以通过数据门控和时钟门控来抑制。这会增加面积,但对降低虚假功耗的效果相当显著,” 马德瓦帕西说。

这需要通过分析来确定主要的功耗来源。它不仅能测量毛刺功耗,还能找出产生毛刺的原因,” 斯温嫩指出。

归根结底,在实现层面能产生的影响是有限的。“RTL(寄存器传输级)层面的优化空间是有上限的,这很讽刺,因为大多数节能机会都集中在 RTL 层面,” 斯温嫩说,最大的收益其实来自架构层面。

代价高昂的特性

人工智能(AI)计算将设计团队推向了 内存墙” 的挑战,因此,鉴于行业对 AI 训练和推理的关注,大量精力都投入到了如何让数万亿参数在需要时出现在需要的位置 —— 同时避免功耗过高。但处理器本身也会消耗能量,而且其他工作负载在执行功耗和数据移动功耗之间的平衡会有所不同。

尽管时钟频率仍在逐步攀升,但这种提升对性能的推动作用已远不如从前。如今,性能改进的核心目标是尽可能让处理器的更多部分保持忙碌状态。有三个架构特性可以体现这种改进带来的复杂变化:推测执行(又称分支预测)、乱序执行和有限并行性。

推测执行的目的是避免这样一种情况:当遇到分支指令时,必须等待分支结果才能决定后续执行路径。等到此时再行动会延迟结果输出,因为系统需要根据分支结果从 DRAM 中读取相应指令。相反,推测执行会预先沿着一条分支(通常是最可能的那条)执行。通常,分支决策完成后会验证该推测是否正确,但有时也会出错。这时就必须撤销推测计算的结果,重新执行另一条分支(包括可能从 DRAM 中读取指令)。

分支预测通常与乱序执行配合使用,后者允许指令的执行顺序与程序中的排列顺序不同。其核心思想是:当一条指令因等待数据而停滞时,另一条后续指令可能已经准备就绪。需要注意的是,后者不能依赖于前者,但串行编程范式的一个主要限制是,即使指令之间没有依赖关系,也必须按顺序列出。因此,乱序执行是一个复杂的系统,它能提前启动多条指令,同时确保遵循原始程序的语义。

 1:英特尔处理器微架构示例。该单元包含乱序处理功能。由于需要向后兼容代码,指令在执行前会先转换为微码。该模型有 11 个功能单元,其中 个用于执行,个用于数据加载 存储。来源:I, Appaloosa, CC BY-SA 3.0

面积与性能的权衡

这些都不是简单的系统,其成本可能与其收益不成比例,具体取决于设计方式。例如,分支预测器会记录之前执行过的分支,” 西门子 EDASiemens EDA)高级合成部门项目总监拉斯・克莱因(Russ Klein)说,和缓存类似,这个记录列表通常会使用分支目标的低 位作为哈希键,来索引已执行的分支列表。可以是 416 或更大,列表中的条目数量可以是 1或 32。你可以存储完整的分支目标地址,也可以只存储低 12 位或 16 位。对已执行分支的记录越详细、容量越大,性能就越好,但显然会占用更多空间(和功耗)。

由此带来的收益也会相应变化。一个小型简单的分支预测器可能会使处理器速度提升 15%,而一个大型复杂的预测器可能提升 30%。但后者的面积可能是前者的 10 倍(甚至更多),” 克莱因解释道,从面积上看可能无关紧要,但对功耗来说,这就成了大问题。

铿腾电子通过重构部分编解码器来提升性能,得到的代码分支更少。我们看到性能提升了约 5% 到 15%” 马德瓦帕西说,编解码器中的分支数量不到 5%,而且在我们使用 ZOL(零开销循环)的内部执行循环中,几乎没有分支。

更普遍地说,该公司发现普通程序中的分支更多。实际代码中约 20% 的指令是分支指令,” 马德瓦帕西说,每一个分支都是推测执行的机会。由于每周期执行的平均指令数显著增加,性能提升可达 30% 或更高 —— 即使这些预测中只有一半是正确的。(分支预测和乱序执行的)综合开销可能在 20% 到 30% 之间。

克莱因回忆起 Tilera 创始人阿南特・阿加瓦尔(Anant Agarwal)曾提到的 淘汰法则Kill Rule)。该法则指出,如果你要在 CPU 中加入一个特性,它会增加面积,而如果面积的增加量超过了性能的提升量,就不应该加入这个特性,” 他说。

并行计算是简单” 答案

并行性显然是提升性能的另一种方式,但当前处理器中的并行能力有限。如今的主流处理器主要通过两种方式提供并行性:集成多个核心,以及在单个核心内集成多个功能单元。

功能单元类似于过去的简单算术逻辑单元(ALU),是实际执行指令的部件。一个功能单元通常能执行除简单数学运算外的多种指令,可能包括乘法器、除法器、地址生成器,甚至分支处理单元。通过提供多个这样的单元,当一个单元忙碌时,另一个可能空闲,可用于执行另一条指令(可能是乱序的)。

不同处理器的功能单元数量不同,代码分析有助于确定这些单元中指令支持的组合和分布。这有助于在可能的情况下实现指令执行的并行化,但处理器的开销(如指令读取)仍是串行的。

真正的计算并行化是提升性能的最佳机会之一,而且如果处理器设计不那么复杂,可能会更节能。但这种解决方案并不新鲜。十多年前就有商用的众核处理器,但未能获得广泛认可。

很少有算法能完全并行化。那些能完全并行化的通常被称为易并行embarrassingly parallel)算法。其他算法则是并行代码和串行代码段的混合体。阿姆达尔定律(Amdahl’s Law)指出,串行部分是性能提升的最终限制因素。有些程序可以高度并行化,有些则不能。但即使一个算法看似无法并行,也可能存在其他并行机会。

分形就是一个例子。“f (x) 依赖于 f (x-1)” 克莱因解释道,每个像素都通过一长串串行计算得到。但如果是处理图像,比如 1024×1024 的图像,就有很多并行机会(可以同时计算多个像素)。

如今的数据中心服务器处理器最多可集成约 100 个核心。但与之前的众核处理器不同,这些核心不是用于运行单个程序,而是允许为不同用户的多个程序提供云计算服务。

并行计算的问题

即使算法可以并行化,关键问题在于处理器必须通过并行方式编程。这通常意味着要显式管理代码的并行性,例如使用 pThreads。这比普通编程复杂得多,需要了解数据依赖关系,以确保符合顺序语义。尽管有一些工具可以提供帮助,但没有一种工具进入主流软件开发领域。

此外,手动管理并行性可能需要为不同处理器编写不同的程序。如果所需线程数超过特定处理器的硬件支持能力,程序可能能运行,但无法达到最佳性能。转向软件并行性可能会因上下文切换开销而降低性能。

最大的问题是,软件开发人员对显式并行编程不屑一顾。他们强烈希望任何新技术都能通过现有方法编程。除了一个领域(我们看到它开始渗透)——GPU 和 TPU,软件开发人员坚决反对 100 核处理器的概念,” 克莱因观察到。

这就是众核处理器在商业上失败的原因。即便如此,并行化的主要目的还是提升性能。降低功耗需要采用适度的核心设计和积极的断电策略,以避免空闲核心消耗能量。并行性还有助于恢复因核心能效优化而可能损失的整体性能。

我的观点是,大规模阵列的极简 CPU 是可行的,但这需要改变编程方法,” 他说,实现这一点的唯一希望是,AI 能够创建一个并行化编译器,而这是整个行业一直未能做到的。

如今,处理在通用处理器上运行缓慢的算法的实用方法是使用加速器作为非阻塞卸载单元,这样加速器可以高效处理其任务,而 CPU 则执行其他任务(或休眠)。

加速器可广可专

各类加速器已经存在了数十年。如今,鉴于 AI 训练和推理所需的特定密集计算,大量注意力都集中在能加速这些任务的加速器上。但这类加速器并非新事物。

异构计算结合了不同的处理核心,以提供优化的功耗和性能,”Expedera 营销副总裁保罗・卡拉祖巴(Paul Karazuba)说,这显然包括神经网络处理器(NPU)。NPU 接管了原本由能效较低的 CPU 和 GPU 处理的所有 AI 计算。然而,并非所有 NPU 都生而平等—— 无论是在设计方法、架构还是利用率方面。

这是因为有些加速器可能高度专用(甚至定制化),而另一些则保持更通用的特性。如果 AI 工作负载已知且稳定,定制 NPU 可以在功耗和成本效率上带来显著提升,” 卡拉祖巴继续说,如果需要灵活性以支持多种模型或未来的 AI 趋势,通用 NPU 更具适应性,也更容易与现有软件生态系统集成。

定制加速器会使其更贴合特定工作负载,这种努力应该能提升能效。

针对 NPU 而言,提高处理器子系统效率的一种方法是设计更面向应用的 NPU,而非采用更通用的方案,” 卡拉祖巴说,定制 NPU 通常使用专门的 MAC(乘加)阵列和执行流水线,可能针对特定数据类型和模型结构进行优化。通用 NPU 则由可配置计算单元组成,支持多种数据类型,通常适用于更广泛的层和算子。

摒弃特定任务不需要的特性可以带来显著效果。在实际应用中,Expedera 发现,部署定制 NPU 时,处理器效率(以 TOPS/W 衡量)通常能提升约 到 倍,利用率(定义为实际吞吐量与理论最大吞吐量之比)提升超过 倍。

当所有技巧都用尽时会发生什么?

显然,在提升处理器(及处理子系统)效率方面仍有一些机会。但在不远的将来,我们可能会面临无计可施” 的风险。到那时会发生什么?

这正是新处理器架构可能发挥作用的地方。然而,鉴于当前架构背后存在庞大的生态系统,这种变革并非易事。幸运的是,已有一些新的架构理念,而且我们也有可能放弃部分通用性。

原文:

https://semiengineering.com/can-todays-processor-architectures-be-made-more-efficient

欢迎加入EETOP RISC-V 信群