Eit*_*tan 19 hardware cpu cpu-usage hardware-interface
我试图想出一个启发式来估计一个进程或一个线程在两个时间点之间消耗了多少能量(例如,在焦耳中).这是在PC(Linux/x86)上,而不是移动设备,因此统计数据将用于比较采用类似挂钟时间的计算的相对能效.
这个想法是收集或采样硬件统计数据,如周期计数器,p/c状态或动态频率,总线访问等,并提出一个合理的测量间能量使用公式.我问的是这是否可能,以及这个公式可能是什么样子.
想到的一些挑战:1)正确地考虑到其他进程(或线程)的上下文切换.
2)正确计算CPU外部使用的能量.如果我们假设I/O可以忽略不计,这意味着主要是RAM.分配数量和/或访问模式如何影响能源使用?(也就是说,假设我有办法测量动态内存分配,例如,使用修改后的分配器.)
3)使用CPU时间作为估计仅限于粗粒度和错误计算,仅限 CPU能量使用,并假设固定时钟频率.它包括但不能很好地考虑等待RAM的时间.
Joh*_*ley 14
您可能能够获得过程功耗的数字,但它只能是孤立的.例如,如果您并行运行两个进程,则不太可能精确地拟合直线.
这对于完全打破每个电压轨的嵌入式平台来说已经足够了,更不用说在一个数据点来自插座的瓦数的PC上.你需要衡量和记住的事情:
测量它的基本方法是显而易见的方法:记录空闲时的瓦数,记录使用的瓦数,减去.您可以尝试以50%占空比,25%,75%等运行,以绘制漂亮的图形(线性或其他).这将显示任何非线性.不幸的是,CPU调节器和PSU的转换效率与负载将是主要原因.没有你正在玩的主板的开发版本(不太可能),或者如果你有幸拥有一个效率与负载图表的PSU,那么你可以做很多事情来消除它.
但是,重要的是要意识到这些数据点只是孤立正确的.你可以很好地建模这些东西在系统中总结的方式,但要非常清楚它只是一个很好的近似.可以认为它等同于查看音频编解码器的某些C代码并估计其运行速度.你可以得到一个很好的总体思路,但在现实中衡量时,预计会非常不准确.
编辑 - 扩展一点,因为上面并没有真正回答你如何去做.
测量功耗:获得准确的功率表.正如我所提到的,除非您有办法打破各个电压轨并测量电流,否则您可以在出口处进行唯一的测量.或者,如果您可以访问主板上的健康监控状态,并且具有当前(安培)报告(罕见),则可以提供良好的准确性和快速响应时间.
因此,测量基准功率 - 选择您认为是"基础"的任何情况.运行测试,并测量"峰值".减去,完成.是的,这是相当明显的.如果你有一些差异如此小的东西,它会在噪音中丢失,你可以尝试测量一段时间内的能源使用量(例如,千瓦时).尝试在怠速时测量一小时与一小时的时间,使您的过程平稳运行,并查看总能量差异.对您要执行的所有类型的测试重复类似.
对于繁重的CPU,DDR和GPU用户,您将获得明显的功率差异.您可能会注意到L1与L2与DDR约束算法(DDR使用更多功率)之间的区别,如果您需要注意L1/L2约束算法运行速度更快 - 您需要考虑每个"任务"使用的能量没有持续的力量.除了性能损失之外,您可能不会注意到硬盘访问(实际上只有一两瓦,而在PC中的噪音中丢失).值得记录的另一个数据点是,如果使用1%的CPU,每100ms左右唤醒任务,"基本"负载会增加多少.这基本上就是非深度睡眠空闲的样子.(这是一个黑客,100毫秒是一个猜测)
请注意,如果您的CPU启用了频率更改策略,则1%可能会在另一时间与1%不同.
最后一个重要的注意事项:当然,你应该测量能量,就像你提出问题一样.很容易犯一个任务与另一个任务的功耗基准测试的错误,并且总结一个更昂贵...如果你忘记了它们的相对性能.例如,对于以硬盘与SSD为基准的坏技术记者,这种情况总会发生.
在具有跨多个轨道的电流监控的嵌入式平台上,我已经完成了每条指令低至纳焦耳的测量.通过线程/进程来计算能量使用仍然很困难,因为许多任务共享了很多负载,并且它可以在其时间片之外增加/减少.在PC上,我不确定你能不能像那样精细:)