当今的处理器架构能否更高效?
多年来,处理器在专注于性能的同时几乎没有对其他任何东西负责。但现在,性能虽然还是很重要的参考指标,但处理器还必须对功耗负责。
如果性能上的微小提升导致不成比例的功率增益,设计人员可能需要放弃此类改进,转而采用更节能的改进。尽管当前的架构在性能和功耗方面不断改进,但实现额外的增益变得越来越困难。
“每个人都在检查和重构他们的微架构,以期能通过改进它们来实现更出色的功耗表现,”Cadence Tensilica 音频/语音 DSP 产品营销总监 Prakash Madhvapathy 说。
许多旨在提高计算吞吐量的处理器功能(例如无序执行)增加了电路的复杂性,从而提高了功率和电路面积。由于功耗成本的原因,类似的改进今天可能不会被接受。那么,我们当前的处理器架构还有哪些机会呢?
高效的实现还不够
“许多提高效率的努力都涉及对现有架构进行更好的设计,并且仍然需要一些新的技术突破。特别是在实施方面要融入更多节能技术,”Ansys产品营销总监Marc Swinnen说。一种非常基本的方法是利用流程改进,以更少的功率完成更多工作。“摩尔定律并没有消亡,” Swinnen说。“我们仍在获得更小的工艺技术,这一直是降低功耗的首要方法。摩尔定律可能很快走到尽头,但现在还没有完全实现。”
这也可以推动流程决策。“当你选择某个工艺节点时,你还需要考虑到能效,”Madhvapathy 说。“22nm从基础上来看比28nm具有更好的功耗曲线。”他指出,12nm将是节能设计的另一个流行节点。
3D-IC 提供了介于单片芯片和 PCB 级组件之间新的功耗节点。Swinnen指出:“3D-IC的功耗将比单片芯片更高,但3D-IC的整体系统功耗更低,速度比通过传统PCB走线连接的多个芯片系统的要低得多。
共封装光学器件 (CPO) 使光学器件更接近硅,这也可以降低功耗,但这已经等了很长时间。“CPO 已经存在了很长时间,但在经济上很难证明技术复杂度的合理性,而且最终的权衡不一定是有利的,”Swinnen 解释道。“不过这似乎正在发生变化。部分原因是技术变得更好,部分原因是对高速数字通信的需求变得如此强烈,以至于人们愿意为此支付更多费用。
并非所有技术都实用
有些实现技术听起来很有趣,但也有其自身的挑战。异步设计就是其中之一。“从好的方面来说,每个寄存器都会尽可能快地与下一个寄存器通信,”Swinnen 解释道。“没有中央时钟,所以整个时钟架构都消失了。没有时间给你等待,其中一条数据路径正在等待其他数据路径。它已经存在了几十年,但由于性能不可预测,它未能突破(特定情况除外)。这是一个猜谜游戏,突破的时间点会是什么,由于工艺的可变性,每个芯片都可能略有不同。也不清楚它最终是否真的节省了电力。“自动定时握手意味着触发器电路必须复杂得多,”斯温宁说。“当你把它全部拿出来时,所有触发器电路都会消耗更多的电力。一个问题仍然存在:“它真的最终会为所有这些复杂性和缺乏可预测性节省很多电力吗?综合来看,它还没有能够作为一种设计方法论得到公认。
也可以使用数据和时钟门控来驯服杂散电源或毛刺电源以降低功耗。“它会增加面积,但对杂散电源的影响可能相当大,”Madhvapathy 说。这需要分析以确定功耗的主要贡献者。“它不仅可以测量毛刺功率,还可以识别导致此毛刺的原因,”Swinnen 指出。
最后,每一个问题在实现层面上的影响有限。“RTL能走多远是有限制的,这很讽刺,因为大多数节能机会都在RTL级别,”Swinnen 说。“最大的好处实际上是在架构层面。”
昂贵的功能
人工智能(AI)计算已将设计团队推向内存墙,因此鉴于行业对AI训练和推理的关注,人们将大量注意力转移到将数万亿个参数放在需要的地方,以避免摧毁系统。但处理器本身也会消耗能量,其他工作负载将在执行能力和数据移动能力之间表现出不同的平衡。
尽管时钟频率继续逐渐攀升,但这种变化实际上并没有像以前那样推动性能提升。改进的真正目标是试图让尽可能多的处理器保持忙碌。三个架构特征可以说明为这种收益所做的复杂变化——推测执行(也称为分支预测)、无序执行和有限的并行性。
推测执行的目的是避免输入分支指令并且必须等待结果后再决定遵循哪些分支的情况。到那个点时就会延迟结果,直到系统获取分支结果指示的指令——可能一直来自DRAM。相反,推测性地遵循一个分支——希望是最有可能的分支。通常,完成分支决策将验证该决策,但有时不会。此时,必须退出推测计算并重新启动另一个分支(包括从 DRAM 获取的潜在指令)。
分支预测通常伴随着无序执行,该功能允许某些指令以与它们在程序中的显示方式不同的顺序执行。这个想法是,一条指令可能会停顿等待数据,而另一条后续指令现在已准备就绪。请注意,后一条指令不能依赖于前一条指令,但串行编程范式的主要限制之一是指令必须按顺序列出,即使它们不相互依赖。所以乱序执行是一个复杂的系统,可以提前启动多条指令,确保原始程序语义得到尊重。
图 1:Intel 处理器微架构示例。此特定单元包括乱序处理。由于需要向后代码兼容性,因此在执行之前,首先将指令转换为微代码。此模型有 11 个函数单元,其中 8 个用于执行,3 个用于数据加载/存储。
面积与性能
这些架构并不是简单的系统,它们的价格可能与其收益不成比例,具体取决于它们的构建方式。“例如,分支预测器会保留先前采用的分支列表,”西门子 EDA 高级合成部门项目总监 Russ Klein说。“就像缓存一样,该列表通常使用分支目标的底部N位作为哈希键进入所采用的分支列表。因此N可以是4或16或更多,列表中的条目数可以是1或2或32。您可以存储完整的目标分支地址,或者仅存储底部12位或16位。对所采用的分支的更大、更详细的存储器会带来更好的性能,但显然会占用更多的空间(和功率)。
由此产生的好处可能会相应地有所不同。“一个小型的简单分支预测器可能会将处理器加速 15%,而一个大型、复杂的分支预测器可以将性能提高30%。但它可能比小而简单的处理器面积上大10倍(或更多),“Klein解释道。“就面积而言,对性能设计者也许不是那么在意,但对于功耗来说,面积确实是一件大事。”
Cadence 通过重组某些编解码器来提高它们的性能,从而产生分支很少的代码。“我们看到绩效提高了约5%至15%,”Madhvapathy 说。“编解码器中的分支数量不到5%,在我们使用 ZOL(零开销循环)的内部执行循环中几乎没有分支。”
更通俗的说,该公司在典型项目中找到了更多的分支。“非官方的代码大约有20%的指令是分支,”Madhvapathy。“这些都代表着随机执行的机会。性能提升可以达到30%或更高,因为每个周期执行的平均指令会显着增加——即使这些预测中有一半是成功的。综合开销 [分支预测和无序执行] 可能在20%到30%的范围内。
Klein回忆起 Tilera 的创始人阿南特·阿加瓦尔 (Anant Agarwal)对Kill Rule的观点。“终止规则规定的是,如果你要将一个功能放入你的 CPU 中但它会增加面积,如果增加的面积大于你获得的性能提升,你就不会添加该功能,”他说。
并行计算是“简单”的答案
并行性显然提供了另一种提高性能的方法,但当前处理器中可用的功能是有限的。当今的主流处理器有两种方式提供并行性——通过实例化多个内核,以及通过内核内的多个功能单元。
功能单元是过去的简单算术逻辑单元(ALU),它是执行实际指令的。给定的功能单元通常能够执行简单数学之外的一定数量的指令。它们还可能包括乘法器、分隔器、地址生成,甚至分支。通过提供多个这样的单元,当一个单元繁忙时,另一个单元可以处理不同的指令,这可能是无序的。
不同的处理器具有不同数量的功能单元,代码分析有助于确定其中指令支持的组合和分布。这有助于在可能的情况下并行化指令执行,但处理器开销(例如指令获取)是串行发生的。
真正并行化计算是提高性能的最佳机会之一,并且可以使用较少的处理器以提高能效。这样的解决方案并不新鲜,多核处理器在十多年前就已上市,但未能获得真正意义上的关注。
很少有算法是完全可并行化的。那些通常被称为“令人尴尬的并行”。其他所有内容都混合了可并行化的代码和必须串行运行的段。阿姆达尔定律将这些连续部分确定为最终限制器。有些程序可以高度并行化,有些则不然。但即使算法看起来不并行,也可能存在其他机会。
分形就是一个例子。“你的 f of x 就是 f of x – 1,” Klein解释道。“每个像素都是通过长串行链单独计算的。但是,如果你正在制作图像,你有 1,024 x 1,024 或任何图像大小,所以你有很多并行性的机会 [通过同时计算多个像素]。
当今用于数据中心服务器的处理器具有多达100个左右的内核。但与之前的多核处理器不同的是,它们不用于单个程序。它们允许为需要云计算的不同用户执行多个程序。
并行的问题
即使处理器执行可以并行化,真正的问题是处理器必须并行编程。这通常意味着显式管理代码的并行性质,例如通过调用pThreads。这比典型的编程要繁琐得多,需要了解数据依赖关系以确保满足按顺序的语义。尽管已经存在一些工具来帮助解决这个问题,但没有一个工具进入现在的主流软件开发。
此外,手动管理并行性可能需要针对不同的处理器使用不同的程序。程序可以运行,但如果需要的线程数超过给定处理器在硬件中可以管理的线程数,则程序可能不是最佳的。由于上下文切换过程中不可避免存在系统开销(虚耗),使用软件并行性可能会损害性能。
最大的问题是软件开发人员对显式并行编程嗤之以鼻。人们强烈希望任何新事物都可以使用当前的方法进行编程。“软件专家已经坚决拒绝了100核处理器的概念,除了我们看到它开始蔓延的一个领域——GPU和TPU,” Klein观察到。
这就是多核处理器在商业上失败的原因。即便如此,并行化主要还是与性能有关。降低功耗需要适度的核心数量和积极的待机功耗策略,以便空闲核心不会消耗能量。并行性还有助于恢复在提高内核效率时可能丢失的整体性能。
“我的论点是,大量真正简单的CPU是正确的选择,但它确实需要改变编程方法,” Klein说。“我对这种情况的唯一希望是人工智能能够创建一个并行编译器,这是我们作为一个行业永远无法做到的事情。”
我们今天处理在通用处理器上陷入困境算法时的实用方法是使用加速器作为非阻塞卸载,以便加速器可以在 CPU 执行其他作(或休眠)时有效地处理其任务。
加速器可以是宽的,也可以是窄的
所有类型的加速器已经存在了几十年。如今,人们非常重视那些可以加快训练和推理速度的加速器,因为需要非常具体的密集计算。但这样的加速器并不新鲜。
“异构计算结合了处理内核,以提供优化的功率和性能,”艾伯德营销副总裁Paul Karazuba 说。“这显然包括NPU,NPU解决了来自效率较低的CPU和GPU进行AI处理时的问题。然而,并非所有NPU都是平等的——不仅在方法上,而且在架构和利用率上。
这是因为加速器可能是高度特定的——甚至是定制的——而其他加速器将仍然是更通用的。“如果AI工作负载是众所周知且稳定的,定制NPU可以在功耗和成本效率方面带来显着提升,”Karazuba 继续说道。“如果您需要灵活地支持多种模型或未来的人工智能趋势,通用 NPU更具适应性,更容易与现有软件生态系统集成。”
自定义加速器将更具体地根据其工作负载进行调整,并且这种努力应该会提高功耗效率。Karazuza 说:“提高处理器子系统效率(特定于NPU)的一种方法是创建一个更注重应用程序的NPU,而不是采用更通用的NPU。“自定义NPU通常使用专门的MAC阵列和执行管道,这些阵列和执行管道可以针对特定数据类型和模型结构进行调整。通用NPU包含支持多种数据类型的可配置计算元素,通常可处理更广泛的层和运算符。
放弃给定任务不需要的功能可以产生显着的结果。“在实际应用中,当部署定制NPU时,Expedera通常会看到处理器效率提高约3-4倍(以 TOPS/W 为单位)而利用率提高两倍以上,这里的利用率定义为实际吞吐量/理论最大吞吐量。”
显然在提高处理器和处理子系统的效率方面,仍然存在一些机会。但在不久的将来,我们可能会面临想法耗尽的风险。然后会发生什么?这就是新的处理器架构可能有用的地方。然而,考虑到当前架构背后的庞大生态系统,这样的变化并非易事。幸运的是,有一些新的架构想法以及放弃一些通用性的可能性。
评论