在硬件实现过程中,我们付出了很多努力来优化,但这只是能够优化的功耗的一小部分。
功耗是一个无处不在的问题,如果不考虑整个系统,就不可能优化系统的能耗。在硬件实现的优化方面已经取得了巨大的进步,但这完全不够。
功耗正迅速成为系统设计首要考虑的因素。随着功耗成为所有计算领域的关键问题,系统架构师被要求考虑硬件和软件设计算法的整体功耗。
系统设计的重点正在从仅针对计算效率(速度、吞吐量、延迟)进行优化转向优化能源效率(每次操作消耗的能量)。这需要考虑内存访问数量、计算的并行性以及专用硬件加速器(特定的加速器可以为某些任务提供更节能的计算)的使用等因素。
系统的设计重点从硬件实现转移到硬件和软件的架构分析。在设计流程的后期阶段,我们有更多的可能性进行自动化,但是对于功耗优化的贡献越来越小。
在考虑功耗优化的优化曲线时,从架构到signoff并不是一条平滑的曲线。综合就是一个拐点,在综合之前的每个阶段都能够优化很大程度的功耗,而在综合之后我们的努力对功耗优化的贡献就会急剧下降。
最大的障碍是,在拐点之前,功耗变得依赖于具体的输入pattern,这使得自动优化变得更加困难。在 RTL 开发过程中,仿真的输入激励可用于发现功耗浪费,并执行logic restructuring、时钟门控和其他减少功耗浪费的技术。
必须对实际的软件工作负载进行分析,以确保涵盖所有可能的场景。我们对于系统的功耗问题,需要更多的前期规划、分析和优化。
需要解决下面这几个方面:
- 进行合理的软硬件划分和处理模块、方案选择;
- 在微架构层面,优化指令集和执行单元;
- 在算法层面,选择和优化算法以提高计算效率和内存访问。类似于RTL一样,优化软件功耗,可以根据系统的底层硬件原理进行软件开发,基本的例如cache结构等。
要想优化这样的系统功耗,即需要虚拟原型设计以及利用能够感知功耗的工具来分析功耗数据,进而优化系统功耗。
软件映射 决定哪些任务需要在软件中执行是一个比较早期的事情。
“我需要实现硬件加速器来卸载CPU么,还是想在软件中执行所有的功能?这对我的功耗有什么影响?”。
随着系统越来越多地由软件定义,在节能和提高性能方面,软件更是一个关键因素。例如,移动设备是一个标准化的SoC系统架构,该架构存在提供不同计算性能的处理器,并且这些处理器都符合通用ISA。这允许将应用程序动态迁移到效率最佳的处理器。通过软件和异构硬件的结合,能够极大地极高计算的能效。
软件通常可以在多个不同类型的处理器上运行,其中有GPU、NPU、IPU,并且这些类型的处理器都需要和CPU 合作。我们可以根据我们看到的工作负载类型来选择应该在哪里运行最节能。
系统的功耗是一件很难优化的事情,因为性能和功耗往往是矛盾的,但是无能如何我们的目标就是在满足性能的同时降低功耗。
另外的困难是工作负载取决于硬件的体系结构。例如,人工智能领域有很多算法类型,这很难回答软件怎样的优化方式可以降低能源成本。
关注软件 仅仅在硬件层面的功耗优化努力已经达到了极限。对于很多应用,软件算法的优化可以减少数据访问或者减少计算量获得相同的结果。
当你弄清楚这一点时,我们可以发现,对于这些算法,总会有一个新的最佳指令集,一个新的微架构,然后在硬件中进一步优化。现在的人工智能算法尚未固化,所以GPGPU才会大行其道。
我们需要对软件开发流程进行重大更改。一些软件开发的目的是尽可能提高生产力,这意味着使用最快和最便宜的软件工具、使用高级语言编程以及以及使用通用处理器。总体方向是提供尽可能多的灵活性和生产力,并仅在绝对必要的情况下进行优化。
而在某些场景下,当功耗成为主要矛盾时,软件开发可能就要牺牲掉灵活性和生产力,需要使用专用的硬件编程方式和指令。
分析 没有分析就没有功耗分析的基础。我们可以创建系统的虚拟模型,包括性能模型和功耗模型。现在,可以针对它运行实际的软件工作负载,生成你所需要的功耗信息。
当然,目前最适合的功耗模型在RTL层次,难点就在于仍然不够前移而且模型开发难度大,此时的功耗数据对于软件算法的功耗优化而言可能为时过晚。