MWAIT与HALT在效率方面

时间:2012-11-20 01:44:40

标签: assembly x86-64 cpu-architecture instruction-set

我对MONITOR-MWAIT与HLT指令有关。 两者都停止处理器,两者都在各种外部触发器(中断等)上唤醒。

在我的实验中,HLT和MWAIT的功能几乎相同,考虑到:

  • 如果您 OS调度程序,带有上述指令的简单循环将会很快中断,并且由于MWAIT需要重新检查MONITOR和MWAIT之间的条件,区别 ? (我要问的是,为什么不首先使用HLT,并节省分配跟踪区域的痛苦(如果不仔细配置,则避免使用mon / mwait机制并将其转换为NOP),因为如果你'不是操作系统调度程序,你不可能快速唤醒,只需检查HLT循环中的值...... ???

(当然,MWAIT可能会有更高的分辨率,我没有测量分辨率,但它似乎过度唤醒了(我假设)中断等等......所以我看不出大的优势。 / p>

谢谢, 任何以这种方式的想法都将不胜感激

3 个答案:

答案 0 :(得分:14)

表现;最重要的是CPU无论何时等待(HLT的IRQ,或MWAIT的IRQ或存储器写入),它都需要时间才能退出“等待”状态。这会影响延迟 - 例如在中断处理程序启动之前或任务切换实际发生之前需要多长时间。对于不同的CPU,CPU退出等待状态所花费的时间是不同的,对于同一CPU上的HLT和MWAIT,也可能略有不同。

这同样适用于功耗 - 等待时消耗的功率在不同CPU之间会有很大差异(特别是当你开始考虑超线程之类的事情时); HLT与MWAIT的功耗在同一CPU上也可能略有不同。

对于使用,它们适用于不同的情况。 HLT用于等待IRQ,而MWAIT用于等待存储器写入发生。当然,如果您正在等待内存写入,那么您需要确定IRQ是否应该中断您的等待(例如,如果您只想等待一个,CLI然后MWAIT记忆写)。

然而,对于多任务系统,大多数情况下它们都只用于相同的事情 - 在CPU闲置的调度程序中。在引入MONITOR / MWAIT之前,调度程序将在等待工作时使用HLT(以减少功耗)。这意味着如果另一个CPU解除阻塞任务,它不能只将该任务放入调度程序的队列中,并且必须向HLTed CPU发送(相对昂贵的)“处理器间中断”以将其从HLT状态中删除(否则)当它可以/应该做的工作时,CPU将继续无所事事。使用MWAIT,这种“处理器间中断”(可能)是不必要的 - 您可以设置MONITOR来监视对调度程序队列的写入,以便将任务放入队列的行为足以导致等待的CPU停止等待

还有一些研究使用MONITOR / MWAIT来实现自旋锁和同步(例如等待释放竞争锁)。这项研究的最终结果是,CPU退出“等待”状态所需的时间过长,使用这样的MONITOR / MWAIT导致性能损失太大(除非存在设计缺陷 - 例如使用自旋锁当你应该使用互斥时。)

我无法想到使用HLT或MWAIT的任何其他原因(超出调度程序和锁定/同步)。

答案 1 :(得分:9)

HLT指令实现了单个线程可用的最浅空闲功率状态(C-State),而MWAIT指令允许您请求所有可用的空闲功率状态以及子状态。

在硬件级别,执行HLT相当于执行状态提示为0的MWAIT。这使处理器处于C1状态,这是核心的时钟门控。如果您想进入更深的C状态以便为核心供电并可能为封装供电,则必须使用MWAIT。

各种电源状态的省电和退出延迟之间总是存在权衡。 C-State越深,节能越多,但退出C-State所需的时间越长。您还应注意,现代x86处理器将根据中断频率限制电源状态的深度(即,如果您每1 us收到一次中断事件,硬件将不会尝试进入具有2 us退出的C状态等待时间)。

除了硬件禁止输入C-State之外,某些C-States只能通过线程之间的协调进入。例如,在具有超线程的Intel x86处理器上,核心中的两个线程都必须请求功率门控C状态,以便在核心级别进行功率门控,同样,包中的所有内核都必须请求包 - 用于功率门控的电平门控C状态发生在封装级。硬件通常遵循最浅的请求,因此如果1个线程请求C1而另一个请求C3,则处理器进入C1。

如果你没有控制操作系统,那真的是一个没有实际意义的点(因为MWAIT仅在CPL0上可用)。如果你“拥有”操作系统,那么使用MWAIT而不是HLT几乎总是有意义的,因为它在很多情况下可以节省更多的功率,并且可以访问与HLT相同的空闲功率状态。

答案 2 :(得分:2)

MONITOR / MWAIT 可用于“自旋锁和同步之类的东西(例如,等待释放竞争锁定)。”

然而,MONITOR / MWAIT(a)因为一个令人惊讶的愚蠢和烦人的原因不得不被限制为只用于0环内核代码,而不是用户代码,并且(b)变得用微码加载以进入低功耗睡觉状态。

有些公司更好地实施了类似或同等的指令,例如,MIPS的LL / PAUSE大致相当于MONITOR / MWAIT。