我知道一些测量程序功耗的工具,如powerTOP、RAPL等。
然而,我想知道是否存在某种基准,比如Agner Fog的CPU基准https://www.agner.org/optimize/instruction_tables.pdf哪个测量每个指令的能耗?
假设我有以下说明
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
movq -8(%rbp), %rdx
movq -16(%rbp), %rax
cmpq %rax, %rdx
setb %al
并且我只希望查看诸如movq
、cmpq
和setb
之类的指令来估计程序的功耗。我使用的是英特尔i5 10400处理器,但我可能正在寻找不同微体系结构的更广泛基准
这可能吗?
与存储转发相比,无序的执行和缓存访问可能会耗费大量精力。通过为每个操作码和寻址模式分配1个数字,无法有效地对功率进行建模CPU未休眠的每个周期的功耗都明显高于整数ALU执行单元,因此需要对性能进行建模。
还有许多其他因素,比如uop缓存命中率降低了前端的能耗。(传统解码耗费电力。(IDK ROB或RS是几乎满了还是几乎空了有多重要;我可以想象,一个几乎空的RS扫描准备执行的指令更便宜。请参阅中的单个核心的框图https://www.realworldtech.com/haswell-cpu/6/并注意到除了执行单元之外还有多少东西。
"争分夺秒";是一个关键概念:更高效的代码可以更快地完成,让整个核心回到睡眠状态。
相关:
- 在预测现代超标量处理器上的操作延迟时需要考虑哪些因素,以及如何手动计算它们
- http://www.lighterra.com/papers/modernmicroprocessors/是必不可少的阅读
- https://en.wikichip.org/wiki/File:Intel_Architecture,_Code_Name_Skylake_Dep_Dive_A_New_Architecture_to_management_Power_Performance _and_Energy_Efficiency.pdf-IDF2015关于电源管理和效率的演讲幻灯片中有很多关于Skylake频率/电压注意事项的详细信息,但在不同的电压/频率水平下,不同事物的相对功率可能非常相似。除了在较低电压下,静态功率(泄漏电流(在总功率中所占比例较大
这并不意味着不可能说任何东西,不过:
每个周期的能量确实随着IPC而增加(更多的执行单元处于活动状态,更多的逻辑将uop调度到执行单元,并绕过将结果转发到物理寄存器(。
但在不同的指令之间,不同的ALU uop之间可能没有什么区别,比如setcc
与sub
与cmp
。sub
和cmp
实际上是相同的ALU运算,只是cmp
只写FLAGS,而sub
也写整数寄存器。整数物理寄存器文件项可以同时保存整数值reg和同一指令产生的FLAGS,这作为设计选择是有意义的,因为大多数x86整数指令都写FLAGS。
一些标量整数ALU指令可能会使用更多的能量,如imul
,以及可能仅在端口1上运行的其他一些3周期延迟指令(popcnt
、pdep
,可能lzcnt
/tzcnt
(。IDK桶形移位器相对于加减法器的效率,但64位移位可能会使用更多。
当你执行更多的后端uop时,我预计会有所不同,例如,内存源为前端和ROB添加解码到微融合的uop,但在RS中,它是单独加载和添加执行端口的uop。(微融合和寻址模式(
不同形式的mov
(加载、存储、reg到reg(显然非常不同,mov消除有助于一些32或64位的reg-reg移动。
SIMD是一些指令真正开始消耗更多能量的地方
特别是当SIMD乘法器处于活动状态时。像您这样的Skylake系列CPU的最高功率工作负载是每个时钟2个256位的FMA,可能会发生一些缓存命中加载/存储,例如作为内存源操作数。(例如Prime95压力测试(。
在不同的1周期延迟整数ALU指令之间,可能差别很小,如果每个周期执行相同数量的指令,则可能无法测量。当然,像您所展示的反优化调试构建充满了存储/重新加载瓶颈,这些瓶颈会扼杀IPC。