有谁知道任何优化嵌入式设备能耗代码的编译器?

时间:2011-01-20 11:17:18

标签: compiler-construction computer-architecture energy

一般认为,更快的代码会消耗更少的功率,因为​​你可以将CPU置于空闲状态更长的时间,但是当我们谈论能耗时,是否有可能:

假设存在一个在1ms内执行的指令序列,并且在执行过程中平均电流消耗为40mA。 。你的Vdd是3.3V

所以消耗的总能量= V * I * t = 3.3 * 40 * 10 ^ -3 * 1 * 10 ^ -3焦耳= 13.2 * 10 ^ -6焦耳

在另一种情况下,有一个指令序列在2ms内执行,在执行过程中平均电流消耗为15mA。 。和Vdd是3.3V

所以消耗的总能量= V * I * t = 3.3 * 15 * 10 ^ -3 * 2 * 10 ^ -3焦耳= 9.9 * 10 ^ -6焦耳

所以问题来了。 ..是否存在具有不同指令集的架构,用于以不同的当前消耗执行相同的任务?

如果有...那么是否有任何编译器将此考虑在内并生成一个节能的代码?

4 个答案:

答案 0 :(得分:4)

我所知道的并不存在,但我认为通过调整指令调度程序的加权算法,可以使用像LLVM这样的编译器框架。

编辑: FOSDEM上有Energy Consumption Analytics in LLVM的讨论。

答案 1 :(得分:1)

实际上,编译器完成的任何“代码优化”都比非优化代码更快地计算答案,是“节能”。 (正如另一张海报所示,避免缓存未命中是一个巨大的胜利)。所以真正的问题是,“哪些优化明确旨在节省能源,而不是缩短执行时间?” (注意:一些“优化”会减少代码占用空间大小(通过将代码序列抽象为子例程等);这实际上可能会花费更多的能量。)

我在任何编译器中都没有看到的一个不寻常的是改变数据的表示。事实证明,存储/传输零比特的成本不同于存储一比特的成本。 (我对TTL和CMOS“零”的体验更为昂贵,因为它们通过电源供电,在硬件中作为一种“有源下拉”实现,从而导致电流因此变热,而“一”则是通过让信号通过相同的下拉“浮动”来实现。如果存在偏差,那么应该实现程序代码和数据以最大化一位的数量,而不是零位。

对于数据,这应该相对简单。请参阅this paper,了解对记忆中发现的价值的非常好的调查和分析;它包含一些非常精彩的图表。一个共同的主题是大量内存位置被一小组不同值的成员占用。实际上,只有非常少量的值(最多8个)占用到48%的内存位置,通常是非常小的数字(论文显示,对于某些程序,大部分数据传输都是针对较小的值,例如0到4,零基本上是最常见的值) 。 如果零存储/传输的确比零更高,则小的常见值建议将值存储为其补码格式。这是一个非常容易实现的优化。鉴于值并不总是最小的N个自然值,可以用N替换存储器中第N个最频繁的值并存储N的补码,查找更接近处理器的实际值。 (该论文的作者建议使用硬件“值重用”缓存,但这不是编译器优化)。

这对程序代码来说有点难以组织,因为指令集决定了你能说什么,通常指令集的设计与任何能量测量无关。然而,人们可以选择不同的指令序列(这是优化器所做的)并且在指令流中最大化一位。我怀疑这对传统指令集操作码非常有效。一旦确定可以将变量放入地址大小为1位的位置,并且更喜欢使用数字较大而不是较低数字的寄存器(在x86上,EAX是二进制寄存器号000,EDI是寄存器号111)可以去至于根据指令执行频率设计一个指令集,将具有较大位数的操作码分配给频繁执行的指令。

答案 2 :(得分:0)

在单独的指令级别,像移位而不是乘法这样的东西肯定会降低电流,从而降低能耗,但我不确定我是否会购买两倍的电流但使用一半电流(对于给定的时钟频率) 。用一个移位替换乘法并添加,使时间加倍,真的需要一半的电流吗? CPU中还有很多其他的东西(只是芯片上的时钟分配需要电流),我认为背景电流使用占主导地位。

降低时钟频率可能是降低功耗的最重要的事情。尽可能多地并行执行是降低时钟频率的最简单方法。例如,使用DMA而不是显式中断允许算法处理以更少的周期完成。如果你的CPU有奇怪的寻址模式或并行指令(我正在看你,TMS320)如果你不能将紧密环路的执行时间减半,那么我会感到惊讶,从而节省了净能量。在Blackfin系列CPU上,降低时钟可以降低核心电压,从而大幅降低功耗。我想其他嵌入式处理器也是如此。

在时钟频率之后,我打赌功耗主要由外部I / O访问决定。在低功耗环境中,像缓存未命中这样的东西会让你受到两次伤害 - 一次是在速度上,一次是在进入外部存储器时。因此,例如,循环展开可能会使事情变得更糟,因为这样会增加所需的指令数量。

所有这些都可以说,创造性的系统架构可能会比告诉编译器支持一组指令而不是另一组指令更能产生功率影响。但我没有数据支持这一点,我很想看到一些。

答案 3 :(得分:0)

尝试“MAGEEC”。我没有编译器的第一手经验。但网站上的描述表明,人们可以生成节能代码。