我试图提出一个启发式来估计一个过程或一个线程在两个时间点之间消耗了多少能量(例如,焦耳)。这是在一台PC (Linux/x86)上,而不是移动的,所以统计数据将被用来比较花费类似的挂钟时间的计算的相对能量效率。
其思想是收集或采样硬件统计数据,如周期计数器、p/c状态或动态频率、总线访问等,并给出测量之间能量使用的合理公式。我想问的是这是否可能,以及这个公式看起来可能是什么样子。
想到的一些挑战是: 1)正确解释上下文切换到其他进程(或线程)。
2)正确核算CPU以外所使用的能量。如果我们假设I/O可以忽略不计,那就意味着大部分是RAM。分配数量和/或访问模式如何影响能源使用?(也就是说,假设我有一种方法来开始测量动态内存分配,例如,使用一个修改的分配器。)
( 3)以CPU时间作为估计值,仅限于粗粒和误算,只考虑CPU的能量消耗,并假定时钟频率固定。它包括在RAM上等待的时间,但并不能很好地说明。
发布于 2011-04-08 21:57:02
您可能能够获得进程功耗的数字,但只有在隔离状态下才能正确。例如,如果并行运行两个进程,则不太可能以很好的精度拟合直线。
这是很难做到的嵌入式平台与一个完整的突破每一个电压轨,更不用说在个人电脑上,你的一个数据点是来自插座的瓦特。你需要衡量和记住的事情:
测量它的基本方法是显而易见的方法:记录空闲的瓦特数,记录正在使用的瓦特数,减去。您可以尝试运行在50%的占空比,25%,75%等,绘制一个漂亮的图表(线性或其他)。这将显示出任何非线性。不幸的是,对于CPU调节器和PSU来说,转换效率和负载将是主要原因。如果没有你正在使用的主板的开发版本(不太可能),或者如果你幸运地拥有一个效率和负载图的PSU,那么你就没什么办法去消除它了。
但是,重要的是要认识到,这些数据点只有在隔离状态下才是正确的。您可以很好地建模这些东西是如何在系统中总结的,但是要非常清楚,它充其量只是一个很好的近似。将其视为相当于查看音频编解码器的一些C代码,并估计它的运行速度。你可以得到一个好的总体想法,但期望是非常不准确的衡量在现实中。
编辑-扩展一点,因为上面的内容并不能真正回答你如何去做。
测量耗电量:给自己一个精确的电度表。正如我提到的,除非你有办法打破单独的电压轨和测量电流,你能做的唯一的测量是在出口。或者,如果您能够访问主板上的健康监测状态,并且具有当前(amps)报告(罕见),则可以提供良好的准确性和快速响应时间。
所以,测量基本瓦特-选择任何你认为是“基地”的情况。运行您的测试,并测量“高峰”。减法,完成。是的,这很明显。如果你有一些差别如此之小以至于在噪音中消失的东西,你可以试着用时间来测量能量消耗(例如kWh)。试着测量一个小时的空闲和一个小时,你的过程运行平平,并看到总能量的差异。对于您想要执行的所有类型的测试,同样地重复。
对于重型CPU、DDR和GPU用户,您将得到明显的瓦特值差异。如果您注意到L1/L2约束算法运行得更快,您可能会注意到L1与L2与DDR约束算法之间的区别(DDR使用的功率要大得多)--您需要考虑每个“任务”所使用的能量,而不是连续的功率。你可能不会注意到硬盘访问(实际上只是一两瓦,在PC中的噪音中迷失了),除了性能的影响。一个值得记录的额外数据点是,如果每100 is左右就有一项任务被唤醒,使用1%的CPU,那么“基本”负载会增加多少。这基本上就是非深度睡眠懒散的样子。(这是一次黑客攻击,100 is是猜测)
请注意,如果您的CPU启用了频率更改策略,则1%可能与另一时间的1%不同。
最后一个重要的问题是:你当然应该测量能量,就像你给问题取名一样。很容易犯一个任务和另一个任务的功耗标杆的错误,从而得出一个比较昂贵的结论。如果你忘记了他们的相对表现。例如,这种情况总是发生在糟糕的技术记者对硬盘和SSD进行基准测试时。
在许多rails上都有当前监视的嵌入式平台上,我已经完成了每条指令下的纳米焦耳的测量。通过线程/进程计算能源消耗仍然很困难,因为许多任务共享了大量的负载,而且它可以在时间之外增加/减少。在PC上,我不确定您是否能做到这样细粒度:)
发布于 2011-04-08 19:37:57
发布于 2010-12-19 21:59:10
在Linux上,尝试PowerTOP实用程序。然而,它不是以焦耳计算绝对值,而是关注不同系统组件之间的相对功率使用情况。
https://stackoverflow.com/questions/4485153
复制相似问题