是否可以在程序中提取指令的能耗?

时间:2018-07-17 21:45:48

标签: linux profiling perf energy

我的意思是,给定一个源代码文件,是否可以使用诸如perf之类的工具来提取特定代码块或1条指令的能耗水平?

2 个答案:

答案 0 :(得分:1)

有一些用于测量功耗的工具(有关链接,请参见@jww的评论),但是它们甚至没有尝试将功耗归因于特定的指令,而perf record可以通过统计方式采样事件->指令相关性。

您可以通过运行同一条指令的整个模块来获得一个想法,就像您尝试微基准化一条指令的吞吐量或延迟时一样。将消耗的能量除以执行的指令数。

但是很大一部分CPU功耗在执行单元之外,特别是对于运行相对便宜的指令(例如标量ADD / AND,或由不同触发的不同内存子系统行为,例如硬件预取)的乱序CPU

数据依赖关系和延迟的不同模式可能很重要。 (或者不是,也许不管有多少指令正在等待它们的输入准备好,无序的调度程序往往都是恒定功率,并且设置旁路转发与从寄存器文件读取可能并不重要。) / p>

因此,每条指令的功率或能量编号没有直接的意义,主要只是相对于一长串依赖的AND指令或其他东西而言。 (应该是功耗最低的指令之一,在ALU中翻转的晶体管数量可能少于使用ADD的晶体管。)对于每个时钟运行1条指令或uop的功率微基准来说,这是一个很好的基准,但对于功率微基准而言,这可能不是一个好的基准。前端正在做更多或更少的工作。

您可能想研究依赖AND与独立NOP或AND指令如何影响每时间能量或每指令能量。 (即执行单元外部的电源如何按时钟指令和/或寄存器读/写回比例缩放。)

答案 1 :(得分:1)

使用jRAPL,它是用于概要分析CPU上运行的Java程序的框架。

例如,以下代码段尝试测量任何代码块的能耗,这些代码块的值是开始和结束之间的差值:

double beginning = EnergyCheck.statCheck();
doWork();
double end = EnergyCheck.statCheck();
System.out.println(end - beginning);

http://gustavopinto.org/lost+found/fase2015.pdf中的该框架的详细论文名为“面向数据的应用级能源优化表征”