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



我必须编写一个应该在英特尔x86处理器上运行的x86汇编代码。

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

如果你们有这样的代码,或者任何人有编写这种类型代码的经验,请分享。

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

例如,请参阅此Skylake超频指南的"压力测试"部分,您可以在其中看到Prime95版本28和Linpack是最热运行的工作负载。 还有一个全系统功耗表。

另请参阅 http://agner.org/optimize/以了解有关CPU内部的更多信息,特别是Agner的微架构指南。 您应该能够通过是否适合环回缓冲区的循环来产生更少或更多的热量。 x86 解码器比重用已解码的 uops 更耗电。 请参阅有关各种循环大小的uop吞吐量的问答,了解指令之间没有显着依赖关系的情况,因此只有前端限制吞吐量。 (另请参阅 x86 标签维基)。


我怀疑你会看到整数add reg, reg与整数的热量有很大不同。mov reg, reg什么的。 也许使整数mul单元的吞吐量饱和会产生可测量的热量/功率差异,但是加法器与 mov 或简单布尔运算的不同成本可能与通过管道跟踪add的无序执行的功率成本相形见绌。

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


为了在不实际睡觉的情况下将热量降至最低,请在循环中使用pause指令。 在Skylake上,它的睡眠时间(~100个周期)比以前的英特尔微架构(~5个周期)IIRC要长得多。

根据Linux上的powertop,内核使用具有不同提示的mwait在Intel CPU(例如我的Skylake桌面)上进入不同级别的睡眠。 如果需要,您可以从用户空间执行此操作,或者使用nanosleep交替睡眠/唤醒并运行具有特定占空比的发热工作负载。

频繁睡眠可能会阻止操作系统将 CPU 提升到全时钟速度,具体取决于您的设置。 为什么这个延迟循环在没有休眠的情况下经过几次迭代后开始运行得更快?

有关降低循环吞吐量的其他想法,请参阅为英特尔 Sandybridge 家族 CPU 中的管道取消优化程序。 在不翻转大量晶体管进行恢复的情况下缓慢失速可能是制作不会产生太多热量的环路的好方法。


如果没有pause,你会看到像.repeat: jmp .repeat这样的简单无限循环的显着加热,特别是在一个可以在热限制允许的情况下"涡轮增压"到高电压/频率的CPU上。

最新更新