每条 x86 指令的能耗?

JOK*_*TOR 6 x86 assembly intel energy cpu-architecture

我知道有一些测量程序功耗的工具,例如 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
Run Code Online (Sandbox Code Playgroud)

我只想查看诸如 、 之类的指令movqcmpqsetb估计程序的功耗。我使用的是 Intel i5 10400 处理器,但我可能正在寻找不同微架构的更广泛的基准测试。
这可能吗?

Pet*_*des 5

无序执行和缓存访问与存储转发可能会消耗大量能量。您无法通过为每个操作码和寻址模式分配 1 个数字来有效地建模功率。CPU 不休眠的每个周期都会比整数 ALU 执行单元消耗更多的电量,因此您需要对性能进行建模。

还有许多其他因素,例如 uop 缓存命中减少了前端的能源使用。(传统解码会消耗电量。)不知道 ROB 或 RS 接近满还是接近空有多么重要;我可以想象一个几乎空的 RS 扫描准备执行的指令会更便宜。请参阅https://www.realworldtech.com/haswell-cpu/6/中的单核框图,并注意除了执行单元之外还有多少东西。

“竞争睡眠”是一个关键概念:更高效的代码可以更快完成并让整个核心返回睡眠状态。

有关的:

但这并不意味着什么都不能说:

每个周期的能量确实会随着 IPC 的增加而增加(更多的执行单元处于活动状态,更多的逻辑将微指令分派到执行单元并将结果旁路转发到物理寄存器)。

但在不同的指令之间,不同的 ALU 微指令之间可能几乎没有什么区别,比如setccvs. subvs. cmpsubcmp实际上是相同的 ALU 操作,只是cmp只写入 FLAGS 与sub同时写入整数寄存器。整数物理寄存器文件条目可以同时保存整数寄存器值和同一指令生成的标志,这作为一种设计选择是有意义的,因为大多数 x86 整数指令都会写入标志。

某些标量整数 ALU 指令可能会使用更多的能量,例如imul某些仅在端口 1 上运行的其他 3 周期延迟指令(popcntpdep,可能是lzcnt/ tzcnt)。我不知道桶式移位器与加减法器相比有多高效,但 64 位移位可能会使用更多一点。

当您执行更多后端微指令时,我预计会有差异,例如,内存源将解码添加到前端和 ROB 的微融合微指令中,但在 RS 中,它是单独加载并为执行端口添加微指令。(微融合和寻址模式

不同形式的mov(加载、存储、reg-to-reg)显然非常不同,mov-elimination可以帮助一些人在 32 位或 64 位的 reg-reg 移动中发挥作用。

SIMD 是某些指令真正开始消耗更多能量的地方

特别是当 SIMD乘法器处于活动状态时。像您这样的 Skylake 系列 CPU 上的最高功率工作负载是每个时钟 2 个 256 位 FMA,可能会发生一些缓存命中加载/存储,例如作为内存源操作数。(例如Prime95压力测试)。

在不同的 1 周期延迟整数 ALU 指令之间,差异可能很小,如果每个周期执行相同数量的指令,则可能无法测量。当然,像您所展示的反优化调试版本充满了杀死 IPC 的存储/重新加载瓶颈。