如何测量代码变化的功率增加或减少

时间:2018-04-28 17:57:56

标签: c++ c mobile embedded profiling

在嵌入式/移动环境中,当我们为其开发软件时必须考虑电池电量消耗,因此节能软件编程在嵌入式/移动世界中很重要。

问题是,(关于 汇编/ C / C ++

认为我们在任意平台上运行时有稳定的软件版本 X 它消耗 Y 功率(以瓦特为单位),现在我们将执行一些代码变化,我们想要衡量它在建设时对能源消耗及其效率的影响。

INT16U x = OXFFFF;
/... some code in stable release .../
for(;x<4096;++x)
{
   /... some code in stable release .../

   INT64U foo = x >> 256 ? x : 4096 ;  // point 1  sample code change;
   if(~foo & foo) foo %= 64 ;         // point 1  sample code change;

   /... some code in stable release .../
}

如果我们想要衡量此代码如何改变@point1对能效的影响(相对于稳定版本统计),而不是分析空间和时间(性能加内存),如果我们想用C / C ++建立一个简单的能量/功率分析和分析工具,

  • 是否有任何推荐的C / C ++库或源代码来构建功耗分析工具?
  • 如果我们必须通过每个代码更改的CPU / GPU指令级别更改来分析和确定功耗级别的变化,例如在point1中,我们如何确定任意CPU的每条指令的功耗或相应平台上的GPU?
  • 开发人员如何知道在应用程序构建时而不是运行时因代码更改而减少或增加了多少功耗?

1 个答案:

答案 0 :(得分:4)

TL; DR您无法使用软件,只能使用物理仪表。

要完善什么&#34; @Some程序员dude&#34;已暗示:

一个问题是,硬件上某个操作的实际实现是未知的。您可能会获得包含周期/操作码的列表,但您不知道这些周期的作用。可以走很长的路,一些需要更多的部件来减少一些等等,因此不知道单个周期需要多少功率。

另一个问题是具有大域(例如16位ADC)和多个输入(例如:一次读取多个传感器)的复杂代码中的几乎不确定的路径,特别是如果您使用浮点运算。 / p>

可以获得功耗的相对差异,但只能获得粗略的功耗。如同#100;相同代码的100个循环需要更多的功率而不是10&#34;粗。或者:如果它运行得更快,它很可能需要更少的电力。

不,你必须吞下苦药,然后去下一个Rhode&amp; Schwarz(不是附属的,只是在写这篇文章的时候在侧边栏上看到一则广告)购买并获得一个电源,一米(两个) ,实际上),频率发生器和必要的连接材料。会让你在中间到高五位数范围(美元)做空。一旦你拥有它,你需要测量你所获得的每一批处理器的几个MCU / CPU(大约30+以便能够统一分配)的功耗。

如果您还没有这些工具,那么这需要大量的工作和投资。测量本身也是一种艺术形式,你需要知道自己在做什么,很多事情都会出错。

如果你想要与军方签订一份价值百万美元的合同并且需要保证你的东西可以用一个电池运行五年(并且第一件事就是说军方正在打耳光),那么花钱可能是一个好主意。上面写着贴纸#34;每6个月更换一次电池!&#34;)否则:不开始,不值得头痛。