19

我试图提出一种启发式方法来估计一个进程或一个线程在两个时间点之间消耗了多少能量(例如,以焦耳为单位)。这是在 PC (Linux/x86) 上,而不是移动设备上,因此统计数据将用于比较花费类似挂钟时间的计算的相对能源效率。

这个想法是收集或采样硬件统计数据,例如循环计数器、p/c 状态或动态频率、总线访问等,并为测量之间的能量使用提供一个合理的公式。我要问的是这是否可能,以及这个公式可能是什么样子。

想到的一些挑战:1)正确考虑上下文切换到其他进程(或线程)。

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

3) 使用 CPU 时间作为估计仅限于粗粒度和经常错误的记帐,仅限CPU 能源使用,并假设固定时钟频率。它包括但不能很好地考虑在 RAM 上等待的时间。

4

5 回答 5

14

您可能能够获得进程的功耗数字,但它只会在孤立的情况下是正确的。例如,如果您并行运行两个进程,则不太可能以良好的精度拟合直线。

这在嵌入式平台上很难做到,每个电压轨都完全断开,更不用说在你的一个数据点是来自插座的瓦数的 PC 上。您需要衡量和牢记的事项:

  • 基本负载不是那么基本。系统闲置数秒后将处于比没有闲置的更深的睡眠状态。你测量“深度”睡眠还是闲置?你怎么知道你在测量哪个?
  • 负载并不总是线性的。可变电压:一些组件根据负载和频率上下移动电压。温度:这些天可以去任何一种方式(不仅仅是热失控)。
  • 电源在所有负载下的效率都不相同。如果您正在测量插座功率,则需要牢记这一点。例如,它在 100W 以下可以有 50% 的效率,在 100-300W 范围内可以达到 90%,在 300W+ 下可以达到 80%。
  • 额外的过程不一定会线性增加。例如,一旦 DDR 脱离空闲状态,它的基本负载就会增加,但额外的进程不会使情况变得更糟。对于多核和可变频率,这更加不可预测。

测量它的基本方法是显而易见的方法:记录空闲瓦数,记录使用瓦数,减去。您可以尝试以 50%、25%、75% 等占空比运行,以绘制漂亮的图形(线性或其他)。这将显示任何非线性。不幸的是,CPU 稳压器和 PSU 的转换效率与负载将是主要原因。如果没有您正在使用的主板的开发版本(不太可能),或者如果您有幸拥有一个带有效率与负载图表的 PSU,您将无法消除这种情况。

但是,重要的是要认识到这些数据点仅在孤立的情况下是正确的。您可以很好地模拟这些事物在系统中的总结方式,但要非常清楚,这充其量只是一个很好的近似值。将其视为等同于查看音频编解码器的一些 C 代码并估计其运行速度。您可以获得一个很好的总体概念,但在实际测量时会非常不准确。

编辑 - 像上面那样扩展一点并不能真正回答你如何去做

测量功耗:为自己准备一个准确的功率计。正如我所提到的,除非您有办法断开各个电压轨并测量电流,否则您只能在插座处进行测量。或者,如果您可以访问主板上的健康监控状态,并且具有电流(安培)报告(罕见),则可以为您提供良好的准确性和快速的响应时间。

因此,测量基本功率 - 选择您认为“基本”的任何情况。运行您的测试,并测量“峰值”。减法,完成。是的,这很明显。如果您有一些差异如此之小以至于在噪音中丢失的东西,您可以尝试测量一段时间内的能源使用情况(例如 kWh)。尝试在空闲时测量一个小时与在您的过程完全运行时测量一个小时,然后查看总能量差异。对您要执行的所有类型的测试重复类似的操作。

对于重度 CPU、DDR 和 GPU 用户,您将获得明显的功率差异。您可能会注意到 L1 与 L2 与 DDR 约束算法之间的差异(DDR 使用更多功率),如果您注意 L1/L2 约束算法运行得更快 - 您需要考虑每个“任务”使用的能量不是持续的力量。除了性能受到影响之外,您可能不会注意到硬盘访问(实际上只有一两瓦,并且在 PC 的噪音中丢失)。一个值得记录的额外数据点是,如果您有一个任务每 100 毫秒左右唤醒一次,使用 1% 的 CPU,那么“基本”负载会增加多少。这基本上就是非深度睡眠空闲的样子。(这是一个 hack,100 毫秒是一个猜测)

请注意,如果您的 CPU 启用了频率更改策略,则 1% 可能与其他时间的 1% 不同。

最后一个重要提示:正如您为问题命名的那样,您当然应该测量能量。如果您忘记了它们的相对性能,很容易犯下一个任务与另一个任务的功耗基准测试的错误,并得出一个更昂贵的结论。例如,糟糕的技术记者对硬盘与 SSD 进行基准测试时,总是会发生这种情况。

在具有跨多个轨道的电流监控的嵌入式平台上,我已经完成了每条指令纳焦耳的测量。仍然很难计算线程/进程的能源使用情况,因为许多任务共享大量负载,并且它可以在其时间片之外增加/减少。在 PC 上,我不确定你是否能做到如此精细:)

于 2011-04-08T21:57:02.710 回答
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 ScholarCiteseer轻松找到更多内容。

于 2011-04-08T19:37:57.043 回答
4

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

于 2010-12-19T21:59:10.080 回答
2

英特尔的能源效率软件指南包含大量有用信息,包括指向他们自己的应用能源工具包的链接。包括...

2) 应用能量绘图工具

Application Energy Graphing Tool 是一种交互式工具,可以随时间测量应用程序的电池功耗,并记录和绘制结果数据。

应用程序开发人员可以使用应用程序能量绘图工具来帮助他们设计应用程序,以节省移动计算机系统上的电池电量。

于 2010-12-19T22:46:29.997 回答
1

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

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

英特尔 SocWatch(英特尔 System Studio 的一部分) - 有很多低级指标,但没有每个进程的绝对能量 (mWh/mJ) 单位。

于 2018-02-24T16:07:37.060 回答