你可能能够得到一个关于你的进程功耗的数字,但这个数字只在隔离环境下是正确的。例如,如果你同时运行两个进程,你很难得到一个准确的直线。
这在嵌入式平台上都很难做到,因为需要每个电压轨道的完整分解,更不用说在PC上了,你的唯一数据点就是插座的瓦数。你需要测量和记住以下几点:
- 基本负载并不那么基本。一个空闲系统会进入比非空闲状态更深的睡眠状态。你是测量"深度"睡眠还是只是空闲?你如何知道你正在测量哪一个?
- 负载不总是线性的。可变电压:一些组件会根据负载和频率调整电压。温度:这些天可以朝任何方向发展(不仅仅是热失控)。
- 所有负载下电源供应器的效率并不相同。如果你在测量插座功率,你需要记住这一点。例如,它可能在100W以下时的效率为50%,在100-300W之间为90%,在300W以上降至80%。
- 附加进程不一定会线性增加。例如,一旦DDR退出空闲状态,它的基本负载会增加,但是其他进程不会使情况变得更糟。这在具有多个核和可变频率的情况下更加难以预测。
衡量功耗的基本方法是明显的方法:记录空闲时的瓦数,记录使用时的瓦数,相减。你可以尝试以50%、25%、75%等运行时间比例运行,以绘制漂亮的图表(线性或非线性)。这将显示任何非线性部分。不幸的是,CPU调节器和电源的转换效率与负载相比将是主要原因。除非拥有你正在使用的主板的开发版本(不太可能),否则你没有什么办法消除这种影响,或者你很幸运拥有一个带有效率与负载相关曲线的电源供应器。
然而,需要意识到这些数据点仅在孤立的情况下才是准确的。您可以很好地对如何在系统中进行这些数据点求和进行建模,但需非常清楚,这只是一个最佳近似。可以将其视为查看音频编解码器的某些C代码并估计其运行速度的等效方法。您可以获得良好的一般性想法,但要想在现实中精确测量时,则可能会存在极大的误差。
编辑-稍微扩展一下,因为上面的内容并没有真正回答您可能要如何去做。
测量功耗:获取一台精确的瓦特表。如我所提到的,除非您有一种方法来分离各个电压轨道并测量电流,否则您唯一能进行的测量就是在插座处。或者,如果您可以访问主板上的健康监控状态,并且那里有电流(安培)报告(罕见),那么可以获得较高的精度和快速响应时间。
因此,测量基本瓦数-选择任何您认为是“基础”的情况。运行测试并测量“峰值”。相减,完成。是的,这相当明显。如果您有某些差异很小以至于在噪音中丢失的情况,可以尝试测量随时间变化的能源使用情况(例如千瓦时)。尝试测量空闲一小时与您的进程全速运行一小时之间的总能量差异。类似地重复所有您想要执行的测试。
您将会在重度使用CPU、DDR和GPU时获得显著的瓦特差异。如果您仔细注意到L1 vs L2 vs DDR受限算法之间的区别(DDR使用更多电力),那么您可能会注意到这种不同,但需要注意每个“任务”所使用的能量而不是连续功率。硬盘访问(实际上只有一两个瓦特,在PC噪音中丢失)除了性能损失外,您可能不会注意到。额外值得记录的一个数据点是,如果您有一个每100毫秒唤醒一次,使用1% CPU的任务,就会增加多少“基本”负载。这基本上就是非深度睡眠空闲状态。 (这是一个技巧,100毫秒是一个猜测)。
请注意,如果您启用了频率更改策略,则1%可能与其他时间的1%不同。
最后一个重要提示:当然,您应该测量的是能量,就像您命名问题一样。如果您忘记了它们的相对性能,很容易犯一个错误,即对比基准测试一个任务的功耗与另一个任务并得出结论哪一个更昂贵。例如,这总是发生在糟糕的技术新闻记者对比基准测试硬盘与固态硬盘时。
在跨多个电路监测电流的嵌入式平台上,我已经对每个指令进行了纳秒级的测量。尽管如此,在线程/进程中计算能量使用仍然很困难,因为有许多负载被许多任务共享,并且可以在其时间片外增加/减少。在PC上,我不确定您是否能够像那样精细。