我的意思是,给定一个源代码文件,是否可以使用诸如perf之类的工具来提取特定代码块或1条指令的能耗水平?
答案 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中的该框架的详细论文名为“面向数据的应用级能源优化表征”