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

Assembly 如何编写x86汇编代码来检查温度对处理器性能的影响,assembly,x86,temperature,Assembly,X86,Temperature,我必须编写一个应在英特尔x86处理器上运行的x86汇编代码 实际上必须编写类似于加法或移动指令的指令,才能看到这些指令对处理器w.r.t温度性能的影响。这意味着我的代码应该能够控制处理器产生的热量 如果您有这样的代码或有编写这种代码经验的人,请与我们分享。为了获得最大热量,您需要尽可能多的晶体管在每个时钟周期改变状态。浮点FMA单元有很多晶体管;让它们忙碌会产生很多热量,尤其是对于256b AVX向量 e、 g.请参阅的“压力测试”部分,您可以在其中看到和Linpack是最热门的运行工作负载。还

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

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


如果您有这样的代码或有编写这种代码经验的人,请与我们分享。

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

e、 g.请参阅的“压力测试”部分,您可以在其中看到和Linpack是最热门的运行工作负载。还有一个整个系统功耗表

另请参阅以了解有关CPU内部的更多信息,特别是Agner的Microach指南。您应该能够通过在环回缓冲区中安装或不安装环来产生更少或更多的热量。x86解码器比重用已解码的UOP功耗更大。请参阅,了解指令之间没有显著依赖关系的情况,因此只有前端限制吞吐量。(另请参见标记wiki)


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

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


要在不睡觉的情况下获得最低热量,请在循环中使用。在Skylake上,它的休眠时间(约100个周期)比以前的Intel微体系结构(约5个周期)IIRC长得多

根据,内核使用不同的提示在Intel CPU(例如my Skylake desktop)上输入不同级别的睡眠。如果需要,您可以从用户空间执行此操作,或者使用
nanosleep
交替睡眠/唤醒,并以特定的工作周期运行发热工作负载

根据您的设置,频繁睡眠可能会阻止操作系统将CPU提升到全时钟速度

有关降低循环吞吐量的其他想法,请参阅。在不翻转大量晶体管来恢复的情况下,缓慢的暂停可能是一种制作不产生太多热量的环路的好方法



如果没有
暂停
,您将看到一个简单的无限循环(如
)会产生显著的热量。重复:jmp。重复
,尤其是在一个CPU上,只要热限制允许,它可以“涡轮增压”到高电压/频率。

编辑您的标题,这样人们就不会被“恶意”误导。如果你需要“控制热量产生”,使用一些反馈方法。您可能根本不需要asm。请稍候“检查温度对性能的影响?”为什么要为此编写自己的代码?你为什么不像正常人一样使用prime95来触发热节流呢?我在回答问题时没有注意到标题中的“检查对性能的影响”部分,因为你甚至没有在问题正文中提到。谢谢@PeterCordes。对于我的项目,我必须这样做。因为我想测量最小的温升,所以我想用一个代码。你应该在问题中这样说。更新了答案,提供了一些关于使最低热量高于闲置温度的想法。我认为使用浮点FMA将大幅提高温度。用这些整数,我想测量尽可能低的温度变化。我可以通过循环来实现这一点吗?有什么办法吗?您有任何示例代码吗?非常感谢。与
add
mov
的紧密循环足以防止处理器睡眠,从而产生热量。当然不是多余的数量,但这听起来像是OP正在寻找的小影响类型。如果你试图精确地“控制”产生的热量,那么这个技巧将与操作系统的调度程序相抗衡。@Peter Cordes@CodyGray我已经运行了Prime95的压力代码,该代码将温度逐渐升高到20度。在我的例子中,它也从40到80。现在我想插入一些,比如说4行不同的代码,与原始代码相比,它们会导致温度的微小偏差,20次,得到20种不同的温度偏差。对于20种不同的温度偏差,如何以及在何处插入这些行20次?谢谢