2016-12-29 19 views
-3

我必须编写应该在Intel x86处理器上运行的x86汇编代码。如何编写x86汇编代码来检查温度对处理器性能的影响

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

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

+0

编辑您的标题,以便人们不会被“恶意”误导。如果您需要“受控生热”,请使用一些反馈方法。你可能根本不需要asm。 – Jester

+1

等一下“检查温度对性能的影响?”你为什么要为此编写自己的代码?为什么不使用prime95来像普通人一样触发热调节?在回答时,我没有注意到“检查效果对表现的影响”部分,因为你甚至没有在问题主体中提到这一点。 –

+0

谢谢@PeterCordes。对于我的项目,我必须这样做。而且,因为我想测量最小的温度增加量,所以我想使用代码。 –

回答

3

对于最大发热量,您希望尽可能多的晶体管在每个时钟周期内改变状态。浮点FMA单元有很多晶体管;保持忙碌状态会产生大量热量,特别是对于256b AVX载体。

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

另请参阅http://agner.org/optimize/以了解有关CPU内部部件的更多信息,尤其是Agner的微型指南。您应该能够通过适合环回缓冲区的循环来减少或减少热量。 x86解码器比重复使用已解码的uops更加耗电。请参阅this Q&A about uop throughput for various loop sizes,对于指令之间没有显着依赖关系的情况,只有前端限制吞吐量。 (另请参阅标记wiki)。


我怀疑你会看到很多不同的热量整数add reg, regmov reg, reg什么的。也许饱和整数的吞吐量mul单元会产生可测量的热/功率差异,但是加法器与mov或者简单布尔操作的不同成本可能被无序执行的功率成本add通过管道。

加载或存储的是保持高速缓存和存储缓冲器硬件活跃可能是一个不同的故事,但add可以有一个存储源或DEST过。只要确保您不会对单个内存目标添加的存储转发延迟产生瓶颈。


对于最小热而不实际睡眠,在循环使用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只是一个简单的无限循环显著加热,尤其是在CPU,可以“涡轮”最多只要热限制允许高电压/频率。

+0

我认为使用浮点FMA会大大增加温度。用我想测量的整数作为低温变化。我可以通过循环做到这一点吗?如果有什么方法?你有任何示例代码?非常感谢。 –

+0

带有'add','mov'的紧密循环,无论如何足以使处理器免于睡眠,从而产生热量。当然,这不是一个多余的数量,但听起来这是OP所寻找的小型影响。如果你试图精确地“控制”产生的热量,这个技巧将与操作系统的调度程序相抗衡。 –

+0

@ Peter Cordes @CodyGray我从Prime95开始运行压力代码,逐渐将温度提高到20度。在我的情况下,它也从40到80。现在我想插入一些代码,让我们说4种不同的代码行数,与原始代码相比,温度变化很小,20次得到20种不同的温度偏差。如何和在哪里可以插入这些线20次,以获得20种不同的温度偏差?谢谢 –