首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有人知道针对嵌入式设备的能耗优化代码的编译器?

有没有人知道针对嵌入式设备的能耗优化代码的编译器?
EN

Stack Overflow用户
提问于 2011-01-20 19:17:18
回答 4查看 394关注 0票数 18

人们普遍认为,更快的代码将消耗更少的电力,因为您可以将CPU置于空闲状态更长的时间,但当我们谈论能耗时,以下是一种可能性:

假设有一个指令序列在1ms内执行,在执行过程中,平均电流消耗是40 say。.and你的Vdd是3.3V

因此总能耗= V*I*t = 3.3 * 40*10^-3 * 1*10^-3焦耳= 13.2*10^-6焦耳

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

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

所以问题来了。。。。是否存在具有不同指令集的体系结构,用于以不同的电流消耗执行相同的任务?

如果有...then,有没有考虑到这一点的编译器,并生成能量高效的代码?

EN

回答 4

Stack Overflow用户

发布于 2011-01-20 21:26:20

据我所知没有,但我认为使用LLVM这样的编译器框架,通过调整指令调度器的加权算法,这应该是可能的。

编辑:在FOSDEM上有一个关于Energy Consumption Analytics in LLVM的演讲。

票数 4
EN

Stack Overflow用户

发布于 2014-08-17 15:39:28

实际上,编译器所做的任何“代码优化”都是“节能”的,它比未优化的代码更快地计算出答案。(正如另一位发帖者所说,避免缓存未命中是一大胜利)。因此,真正的问题是,“哪些优化明确旨在节省能源,而不是减少执行时间?”(注意:一些“优化”减少了代码占用的大小(通过将代码序列抽象成子例程等);这实际上可能会消耗更多的能量)。

一个不同寻常的变化是改变数据的表示形式,这是我在任何编译器中都没有见过的。事实证明,存储/传输零比特的成本与存储1比特的成本不同。(我使用TTL和CMOS的经验是“零”是更昂贵的,因为它们在硬件中实现为一种通过电源电阻的“主动下拉”,导致电流流动从而发热,而“1”是通过相同的下拉让信号“浮动高”来实现的)。如果存在偏差,则应执行程序代码和数据以最大化1位的数量,而不是0位。

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-01-20 22:39:30

在单个指令级别,像移位而不是乘法这样的事情肯定会降低电流,从而降低能耗,但我不确定我是否同意你的例子,即花费两倍的时间,但使用一半的电流(对于给定的时钟速率)。用移位和加法来代替乘法,这会使时间加倍,真的需要一半的电流吗?CPU中还有许多其他的东西(仅仅是整个芯片上的时钟分布需要电流),以至于我认为背景电流的使用占主导地位。

降低时钟频率可能是降低功耗所能做的最重要的事情。尽可能多地并行操作是降低时钟频率的最简单方法。例如,在显式中断上使用DMA允许算法处理在更少的周期内完成。如果你的CPU有奇怪的寻址模式或并行指令(我看着你呢,TMS320),如果你不能在两倍的电流下将紧凑循环的执行时间减半,从而实现净节能,我会感到惊讶。在Blackfin系列CPU上,降低时钟可以降低内核电压,从而显著降低功耗。我想在其他嵌入式处理器上也是如此。

在时钟频率之后,我打赌功耗主要由外部I/O访问控制。在低功耗环境中,像缓存未命中这样的事情会对您造成两次伤害-一次是在速度上,一次是在访问外部内存时。例如,循环展开可能会使情况变得更糟,因为将乘法所需的指令数量增加一倍。

所有这一切都是说,创造性的系统架构可能会比告诉编译器偏爱一组指令比另一组指令更有能力。但我没有数据来支持这一点,我很想看到一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4746410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档