pha*_*aft 1 cpu energy cpu-cycles cpu-architecture
假设我更改了一个单词中的一位并添加了另外两个单词。
更改字中的一位是否比更改整个字消耗更少的 CPU 周期?
如果它消耗更少的 CPU 周期,它会快多少?
大多数 CPU 上除了除法之外,整数 ALU 指令的性能(以时钟周期为单位)与数据无关。ADD 和 XOR 在大多数现代流水线 CPU 上具有相同的 1 周期延迟。(并且在大多数较旧/较简单的 CPU 上,彼此的周期成本相同,无论是否为 1 个周期。)有关现代 x86 CPU 上的数字,
请参阅https://agner.org/optimize/和https://uops.info/。
较低的功耗可以通过允许更高的升压时钟来间接影响性能,而不必因热限制而减慢速度。但这种情况下的差异是如此之小,以至于我不认为它会在主流 CPU 上产生可测量的差异,例如 Alder Lake 的效率核心,甚至是针对低功耗进行更优化的手机 CPU。
典型 CPU(使用 CMOS 逻辑)的功耗与每个周期输出变化值的门数有关。当晶体管导通时,它会从 Vcc 传导电流或传导至地,对逻辑门输出所连接的微小寄生电容进行充电或放电。由于电流路径中的大部分(低)电阻位于晶体管本身,因此电能转化为热量。
有关更多详细信息,请参阅:
ADD 确实需要在字的整个宽度上进行进位传播,例如 for 0xFFFFFFFF + 1,因此 ALU 使用进位超前或进位选择等技巧来将最坏情况下的门延迟延迟保持在一个周期内。
因此,ADD 比简单的按位运算(如 XOR)涉及更多的门,但与控制所有解码和其他控制逻辑以将操作数传送到 ALU 并将结果写回(并可能绕过)的门数量相比仍然不多。转发到立即使用结果的后续指令。)
此外,典型的 ALU 可能没有完全独立的加法器与按位单元,因此许多加法器门可能会看到它们的输入发生变化,但控制信号会阻止进位传播。(即,典型的 ALU 使用许多与 ADD 相同的门来实现 XOR,但使用控制信号控制 AND 门或所有或阻止进位传播。XOR 是无进位加法。)CPU 中的整数 ALU 通常会至少是一个加法器-减法器,因此其中一个输入通过多个门,以及可以使其执行按位运算的其他控制信号。
但是,进行 XOR 运算时,位翻转可能仍然比 ADD 少一些。部分取决于之前的输出是什么(无论它在前一个周期中进行了什么计算,而不是 XOR 的输入之一的值)。但由于进位传播被“与”门阻止,翻转这些门的输入不会改变输出,因此充电或放电的电容更少。
在高性能 CPU 中,大量的功率消耗在流水线和无序执行、跟踪运行中的指令以及写回结果上。因此,即使整个 ALU ADD 操作也只是执行指令的总能量成本的一小部分。由于操作数而导致的功率的微小差异甚至更小。与每个时钟周期有多少个门翻转只是为了将数据和控制信号发送到正确的位置相比,几乎可以忽略不计。
另一个微小的影响:如果您的 CPU 没有进行寄存器重命名,那么在写回结果时,如果结果与寄存器之前保存的内容几乎相同,则可能会更少的晶体管发生翻转(在寄存器文件的 SRAM 中)。
(假设您在 x86 等 ISA 中为 执行xor dst, src操作dst ^= src,而不是在 3 操作数 ISA 中,xor dst, src1, src2如果您没有为dst和选取相同的寄存器,则可能会覆盖不同的值src1。)
如果您的 CPU 通过寄存器重命名进行无序执行,则写入寄存器文件不会覆盖与原始目标值相同的 SRAM 单元,因此这取决于最近在寄存器中计算的其他值。
如果您想查看功率的可测量差异,请运行整数乘法、FP mul 或 FMA 等指令。 或 SIMD 指令,因此 CPU 并行执行 4x 或 8x 32 位加法或洗牌。或 8x 32 位 FMA。典型的现代 x86 CPU 上的最大功率工作负载是每个时钟周期两个 256 位 FMA。
也可以看看: