如何编写 x86 汇编代码来检查温度对处理器性能的影响

How to write x86 assembly code to check the effect of temperature on the performance of the processor

我必须编写一个 x86 汇编代码,应该 运行 在 Intel x86 处理器上。

实际上必须编写类似加法或移动指令才能看到这些指令对处理器性能的影响 w.r.t 温度。这意味着我的代码应该能够控制处理器产生的热量。

如果你们有这样的代码或有编写此类代码经验的人请分享。

为了获得最大热量,您需要尽可能多的晶体管在每个时钟周期改变状态。浮点 FMA 单元有很多晶体管;让它们忙碌会产生大量热量,尤其是对于 256b AVX 向量。

例如请参阅 this Skylake overclocking guide, where you can see that Prime95 version 28 的 "stress testing" 部分,Linpack 是最热门的 运行ning 工作负载。还有一个 table 的全系统功耗。

另请参阅 http://agner.org/optimize/ to learn more about CPU internals, especial Agner's microarch guide. You should be able to make less or more heat by having a loop that fits in the loopback buffer or not. The x86 decoders are much more power-intensive than reusing already-decoded uops. See , for the case where there aren't significant dependencies between the instructions so only the frontend limits throughput. (See also the 标签 wiki)。


我怀疑您会发现整数 add reg, regmov reg, reg 之类的热量有很大不同。也许使整数 mul 单元的吞吐量饱和会产生可测量的热量/功率差异,但是加法器与 mov 或简单布尔运算的不同成本可能与 out-of-通过管道跟踪 add 的订单执行。

使高速缓存和存储缓冲区硬件保持活动状态的加载或存储可能是另一回事,但 add 也可以有内存源或目标。只需确保您不会在单个内存目标添加的存储转发延迟上成为循环瓶颈。


为了在不真正睡觉的情况下获得最少的热量,请在循环中使用pause instruction。在 Skylake 上,它的休眠时间(~100 个周期)比之前的英特尔微架构(~5 个周期)IIRC 长得多。

根据 powertop on Linux, the kernel uses mwait 不同的提示,在 Intel CPU 上进入不同的睡眠级别(例如我的 Skylake 桌面)。如果需要,您可以从 user-space 执行此操作,或者使用 nanosleep 交替 sleep/wake 和 运行 具有特定占空比的发热工作负载。

频繁休眠可能会阻止 OS 将 CPU 加速到全时钟速度,具体取决于您的设置。

有关减少循环吞吐量的其他想法,请参阅 。在不翻转大量晶体管以恢复的情况下缓慢停止可能是制作不会产生太多热量的循环的好方法。


如果没有 pause,您会看到像 .repeat: jmp .repeat 这样的简单无限循环会产生明显的热量,尤其是在 CPU 上可以 "turbo" voltage/frequency 只要热限制允许。