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

qah*_*qah -2 x86 assembly temperature

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

其实要写加法或移动指令之类的,看看这些指令对处理器温度性能的影响。这意味着我的代码应该能够控制处理器产生的热量。

如果您有这样的代码或任何有编写此类代码经验的人,请分享。

Pet*_*des 5

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

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

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


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

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


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

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

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

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


没有pause,您将看到来自简单无限循环(例如 )的显着发热.repeat: jmp .repeat,尤其是在 CPU 上,只要热限制允许,它就可以“加速”到高电压/频率。