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

Din*_*hi 5 c c++ embedded mobile profiling

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

问题是,(关于 Assembly/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 .../
}
Run Code Online (Sandbox Code Playgroud)

简单地说,如果我们想要测量这些代码变化如何@point1影响能效(相对于稳定版本统计)而不是分析空间和时间(性能加内存),如果我们想在C中构建一个简单的能量/功率分析和分析工具/ C++,

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

dea*_*ndi 4

TL;DR 您不能使用软件来做到这一点,只能使用物理仪表。

完善“@Some程序员花花公子”已经暗示的内容:

一个问题是,某一操作在硬件上的实际实现是未知的。您可能会得到带有循环/操作码的列表,但您不知道这些循环的作用。它们可以绕很长的路线,有些需要更多的零件来通过一些更少的零件等等,因此不知道单个自行车需要多少动力。

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

可以获得功耗的相对差异,但只是粗略的差异。粗略就像“相同代码的 100 次循环需要比 10 次粗略更多的功率”。或者:如果它运行得更快,它很可能需要更少的电量。

不,你必须吞下苦果,去下一家罗德与施瓦茨(非附属公司,在写这篇文章时刚刚在侧边栏中看到一则广告)商店,买一个电源、一个仪表(实际上是两个)、一个频率发生器和必要的连接材料。将使您在中上五位数范围内做空(美元)。获得后,您需要测量您获得的每一批处理器的多个 MCU/CPU(大约 30 个以上才能假设均匀分布)的功耗。

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

如果你想与军方签订一百万美元的合同,并且需要保证你的东西能够用一块电池运行五年(军方所说的第一件事就是在上面贴上标签),那么花这笔钱可能是个好主意。它上面写着“每 6 个月更换一次电池!”)否则:甚至不要启动,不值得这么麻烦。