估计单个指令的电流消耗

电器工程 微控制器 计算机架构
2022-01-10 15:20:07

我是一名关注电流消耗的软件工程师。

我知道有一些方法可以减少程序的电流消耗,例如:

  • 使用hlt禁用 CPU 直到下一个中​​断的指令

  • 也许避免使用浮点数,这样 FPU 就不会抖动

我想知道是否可以估计单个指令的当前消耗,以便理论编译器可以选择消耗更少功率的指令。现有的编译器通常可以针对速度或大小进行优化,但我从未见过可以针对电流消耗进行优化的编译器。也许没人考虑过,也许没人研究过每一条指令,也许实际上是不可能的。

但考虑例如一些 NMOS 处理器,如早期的 6502。根据我的直觉,从 0xff 中减去 0xff 会比从 0x01 中减去 0x01 消耗更多的功率,因为​​我认为 ALU 的输入需要更多地预充电。但是,如果有人能告诉我,我对电子产品几乎一无所知,我将不胜感激

a) 我的直觉是正确的

b) 如果您知道 CPU 处于什么状态,那么估计 CPU 指令的当前消耗是很实用的,这样您就可以准确地知道指令在做什么。

4个回答

虽然这在理论上是可能的,但我怀疑它是否可以在实践中以编译器可以在现代处理器中使用信息的方式完成。如果您只想为微不足道的处理器做学术练习,您可能有机会。

您需要为所有可能的寻址模式(立即操作数、寄存器操作数、堆栈操作数等)和所有可能的数据值描述每条指令的功耗

如果指令是从 L1 高速缓存、L2 高速缓存等获取的,您需要测量所使用的能量。您需要以某种方式将用于执行指令的能量与用于解码管道中下一条指令的能量分开,从内存中读取该指令之前的指令,并写入前一条指令的结果。所有这些都是同时发生的。

请记住,编译器不会单独选择指令,它们会选择执行某些所需高级语言操作的指令组。

哦,只要处理器继续满足其数据表规格,制造商就可以随时更改制造工艺。制造参数的微小变化可能会改变漏电流、交流开关电流和晶体管击穿电流的相对重要性。因此,一个制造商的 ARM A9 的数据对于来自同一制造商的另一个特定部件号或来自另一个制造商的 ARM A9 不一定具有任何价值。

在具有深度指令管道的现代超标量 CPU 中,我不确定甚至定义单个指令的功耗会多么容易。即使您可以估计为一条指令与另一条指令切换的门数,CPU 裸片上的制造差异也可能会产生更大的差异。此外,在早期的深亚微米工艺(FinFET 之前)中,CPU 功耗主要是静态泄漏电流,而不是开关电流。

在像微控制器这样更简单、功耗更低的系统中,CPU 不是唯一甚至最重要的功耗消耗者。例如,大部分时间处于休眠状态并定期唤醒以传输无线信号的 MCU 会将其大部分功率用于无线电传输,而不是 CPU。内存也会消耗大量电力,因此在闪存与 RAM 之外运行 CPU 会比执行哪些指令产生更大的差异。在低功耗 MCU 中,整个外围设备和子系统可以在不使用时关闭其时钟。我认为指令之间的微小差异与执行它们所需的时间、内存使用和外围活动相比并不重要。

它已经完成了很多,参见例如here(一篇关于电源效率的随机文章)。有趣的是,为了分析的目的,指令“热值”是指令集和可能的数据流的平均值。

对于简单的 CPU 设计(没有并行性、分支预测、长流水线、高速缓存等),甚至可以估计特定指令类的能耗,例如数据移动、加法/减法、乘法、逻辑运算。即便如此,我们也无法确定同一指令集的不同实现是否具有相同(甚至成比例)的“功率图”。

而对于一个复杂的现代 CPU,它变得非常困难,因为 CPU 真的可以同时处理几条指令。在某些情况下,一些工作甚至被丢弃,因为没有正确预测执行路径。高速缓存、RAM 和其他外围设备通过 DRAM 刷新、I/O 设备和 CPU 竞争访问 RAM 芯片和访问相邻的存储单元可能需要更多或更少的能量,具体取决于这些单元的距离。物理硅。

归根结底,一条指令可能会消耗不同数量级的能量,具体取决于系统还做了什么以及它事先做了什么。

ps 甚至没有开始认为您可以通过在某些寄存器中保留位翻转来节省能源。在现代 CPU 中,寄存器不是一个地方。它只是假装是程序员存储值的单个位置,因为 CPU 使用相当复杂的逻辑将正确的值提供给尝试使用它的下一条指令。

现有的编译器通常可以针对速度或大小进行优化,但我从未见过可以针对电流消耗进行优化的编译器。

如今,最有效的省电策略通常是竞相休眠这意味着:尽可能快地运行,以便您可以更快地关闭整个 CPU。如果您的代码序列可以使用 2 条低功率指令或 1 条高功率指令完成,则第二种选择会更好。

这是因为静态泄漏电流占能源使用的很大一部分,并且无论 CPU 正在执行什么指令,它们都是相同的。只有当 CPU 闲置足够长的时间,可以关闭其电源时,才能避免静态泄漏。

竞争睡眠并不总是可能的实际原因是如果 CPU 必须保持运行以等待某些外部事件,或者如果关闭和打开它需要太长时间。

一些 CPU,如许多基于 ARM 的微控制器,可以关闭单个功能单元,如 FPU。这些平台的编译器通常可以选择不使用 FPU 进行编译。