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

时间:2016-12-29 13:40:14

标签: assembly x86 temperature

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

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

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

1 个答案:

答案 0 :(得分:3)

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

e.g。看到"压力测试" this Skylake overclocking guide的一部分,您可以看到Prime95 version 28和Linpack是最热门​​的工作负载。还有一个全系统功耗表。

另请参阅http://agner.org/optimize/以了解有关CPU内部的更多信息,特别是Agner的微型指南。你应该能够通过一个适合环回缓冲区的循环来减少或减少热量。 x86解码器比重用已经解码的uop功耗更大。请参阅this Q&A about uop throughput for various loop sizes,了解指令之间没有重要依赖关系的情况,因此只有前端限制了吞吐量。 (另请参阅标签wiki)。

我怀疑你会看到整数add reg, regmov reg, reg之类的热量差异很大。也许饱和整数mul单位的吞吐量会产生可衡量的热量/功率差异,但加法器与mov或简单布尔运算的不同成本可能与超出的功率成本相形见绌。订单执行通过管道跟踪add

保持缓存和存储缓冲区硬件活动的加载或存储可能是另一回事,但add也可以有内存源或目标。只需确保您不会出现关于单个内存目标添加的存储转发延迟的瓶颈。

对于没有实际睡眠的最低热量,请在循环中使用pause instruction。在Skylake上,它比以前的英特尔微体系结构(约5个周期),IIRC更长时间(约100个周期)。

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

经常睡眠可能会阻止操作系统将CPU提升到全时钟速度,具体取决于您的设置。 Why does this delay-loop start to run faster after several iterations with no sleep?

有关降低循环吞吐量的其他想法,请参阅Deoptimizing a program for the pipeline in Intel Sandybridge-family CPUs。在没有翻转大量晶体管恢复的情况下,速度很慢的失速可能是制造一个不会产生太多热量的回路的好方法。

如果没有pause,您只会看到像.repeat: jmp .repeat这样的简单无限循环,特别是在可以" turbo"只要热限制允许,就可以达到高电压/频率。