在个人电脑(x86架构)上估算进程能源使用量

19

我正在尝试提出一种启发式方法来估计进程或线程在两个时间点之间消耗的能量(比如以焦耳为单位)。这是在PC上进行的(Linux/x86),而不是移动设备,因此这些统计数据将用于比较需要相似墙钟时间的计算的相对能效。

这个想法是收集或采样硬件统计信息,例如周期计数器、p/c状态或动态频率、总线访问等,并提出一个合理的公式来计算两次测量之间的能源使用情况。我的问题是这是否可行,公式可能是什么样子。

一些可能面临的挑战: 1) 正确计算上下文切换到其他进程(或线程)的影响。

2) 正确计算CPU以外的能量消耗。如果我们假设I/O可以忽略不计,那么主要是RAM。分配数量和/或访问模式如何影响能源使用?(也就是说,假设我有一种测量动态内存分配的方式,例如使用修改过的分配器。)

3) 使用CPU时间作为估计只适用于粗略和经常错误的计算,仅包括CPU能源使用,并假定固定时钟频率。它包括,但不能很好地解释在等待RAM的时间。


2
GPU、磁盘(IOH控制器、磁头寻道(但仅适用于使用旋转磁盘的情况))、声音生成(放大)、网络(无线电使用)如何?不要忘记在电池和主电源上时CPU/GPU速度调整的影响。 - Michael Petrotta
1
我也在研究这个问题。我的第一个假设是基于C状态和频率(对于支持的CPU)。然后,再加上缓存失效事件,可能还有中断... 我的问题是:1. 这些指标是否相关?2. 如何将这些事件与一些功耗估算相结合? - Jérôme
@Jérôme - 我的数字是基于Anandtech的基准测试,他们对其方法和其他系统参数有很好的详细说明。他们还有一个漂亮的图表系统,可以让您查看大量处理器的结果。 如果您正在考虑HPC - 我记得看到一些有趣的数字(每瓦处理能力)适用于Arm和其他嵌入式处理器。(目前找不到链接)。但计算类型非常重要(更多) - NightDweller
1
基本上问题所问的是不可能的。除非系统中只有一个任务/进程/线程,否则你无法总结并计算所有能量来源。太多的资源是共享的,太多的策略受整体活动的影响,太多的设备由后台任务保持高/低电源状态。我已经写了一个关于如何测量功率数据并对CPU活动进行“空中指挥”的计算的答案,但在许多情况下这将是极其不准确的。然而,它确实有一些有限的用途,所以值得一试! - John Ripley
1
@Jérôme - 这里有一篇关于系统评测的文章,链接在这里:http://www.anandtech.com/show/4257/puget-systems-obsidian-solid-as-a-rock/3。我认为你会觉得很有趣。 他们展示了一个系统(基于Core i5 2500k的PC),在空闲状态下仅消耗31瓦特,负载下仅消耗92瓦特(!)。 这是总体功耗。我认为这是一个很好的演示,说明精心选择组件和系统设计如何极大地影响功耗。 - NightDweller
显示剩余8条评论
5个回答

14

你可能能够得到一个关于你的进程功耗的数字,但这个数字只在隔离环境下是正确的。例如,如果你同时运行两个进程,你很难得到一个准确的直线。

这在嵌入式平台上都很难做到,因为需要每个电压轨道的完整分解,更不用说在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上,我不确定您是否能够像那样精细。

7
这是一项正在进行的研究课题,不要期望有确定的答案。一些可能会引起您兴趣的出版物包括:
  • Chunling Hu,Daniel A. Jiménez和Ulrich Kremer,《高效节能程序行为表征》,2007年国际高性能嵌入式体系结构与编译器会议论文集(HiPEAC-2007),第183-197页,2007年1月。(pdf

  • Adam Lewis,Soumik Ghosh和N.-F. Tzeng,《基于服务器系统工作负载的运行时能耗估计》,USENIX 2008,电源感知计算和系统研讨会(html pdf

但您可以轻松地使用Google学术Citeseer找到更多相关内容。

4
在Linux上,可以尝试使用PowerTOP实用程序。但是,它不是计算以焦耳为单位的绝对值,而是专注于各个系统组件之间的相对功耗使用情况。

谢谢。我相信powertop主要是用于查找“电池杀手”,特别是那些导致CPU从空闲状态唤醒,阻止低能耗状态的进程。但这并不是唯一消耗电量的方式,尤其是对于CPU密集型进程。 - Eitan
@Eitan:不是来自电池的电源有哪些呢?:-) 但是没错,我同意它不能回答你的确切问题。 - Chris Dolan
“Wakeups-from-idle”不是CPU消耗功率的唯一方式;它只是不必要功耗的常见原因。自2.6版本以来,请参阅“无滴答内核”。 - tc.
你知道PowerTop 2.0的发布版本发生了什么事吗?该链接已不再可用。 - JJD

2
英译中:

英特尔的节能软件指南提供了大量有用的信息,其中包括一个链接到他们自己的应用程序能源工具包,其中包括...

2) 应用程序能源图形化工具

应用程序能源图形化工具是一种交互式工具,可以测量应用程序随时间消耗的电池功耗,并记录和绘制相关数据。

应用程序开发人员可以使用应用程序能源图形化工具来帮助设计在移动计算机系统上节省电池电力的应用程序。


我对两者都很熟悉。工具包是一个API,它可以让你格式化来自外部电能表的输入,但我没有这个设备。指南有点太笼统了,只能帮助减少功耗,而不能测量功耗。 - Eitan

1

AMD uProf - 提供每个操作系统进程的绝对能量(mJ)单位。

Intel Platform Power Estimation Tool (IPPET) - 原型与每个进程的绝对能量(mWh)单位。

Intel SocWatch(Intel System Studio的一部分)- 具有许多低级度量标准,但没有每个进程的绝对能量(mWh/mJ)单位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接