x86如何在spinlock *中暂停指令,*可以在其他场景中使用吗?

时间:2011-01-18 15:09:02

标签: multithreading x86 spinlock

暂停指令通常用于测试循环spinlock,当其他一些线程拥有自旋锁时,以缓解紧密循环。据说这相当于一些NOP指令。有人能告诉我它是如何适用于自旋锁优化的吗?在我看来,即使是NOP指令也浪费了CPU时间。它们会降低CPU使用率吗?

另一个问题是我可以将暂停指令用于其他类似目的。例如,我有一个忙线程,它不断扫描一些地方(例如队列)来检索新节点;但是,有时队列是空的,线程只是在浪费cpu时间。睡眠线程并通过其他线程唤醒它可能是一个选项,但线程是关键的,所以我不想让它睡觉。可以暂停指令工作以减轻CPU使用率吗?目前它使用100%cpu的物理核心?

感谢。

4 个答案:

答案 0 :(得分:26)

PAUSE通知CPU这是一个自旋锁等待循环,因此可以优化内存和缓存访问。另请参阅pause instruction in x86以获取有关在离开自旋循环时避免内存顺序误推测的更多详细信息。

PAUSE实际上可能会停止CPU一段时间以节省电量。较旧的CPU将其解码为REP NOP,因此您无需检查其是否受支持。较旧的CPU将尽可能快地执行任何操作(NOP)。

另见https://software.intel.com/en-us/articles/benefitting-power-and-performance-sleep-loops


更新:我不认为在队列检查中使用PAUSE是个好主意,除非你要使你的队列成为类似自旋锁(并且没有明显的方法)。

即使使用PAUSE,旋转很长时间仍然非常糟糕。

答案 1 :(得分:13)

处理器在退出时会遭受严重的性能损失 循环因为它检测到可能的内存顺序违规。 PAUSE指令 向处理器提供代码序列是自旋等待循环的提示。该 处理器使用此提示来避免在大多数情况下违反内存顺序, 这极大地提高了处理器性能因此,建议使用 PAUSE指令放在所有自旋等待循环中。 PAUSE指令的另一个功能是降低英特尔处理器的功耗。

[来源:英特尔手册]

答案 2 :(得分:2)

英特尔仅建议在自旋循环非常短时使用PAUSE指令。

正如我从你的问题中所理解的那样,你的案件中的等待时间很长。在这种情况下,不建议使用自旋循环。

你写道,你有一个“线程不断扫描一些地方(例如一个队列)来检索新节点”。

在这种情况下,Intel建议使用操作系统的同步API功能。例如,您可以在队列中出现新节点时创建事件,并使用WaitForSingleObject(Handle, INFINITE)等待此事件。只要出现新节点,队列就会触发此事件。

根据英特尔优化手册,PAUSE指令通常用于在位于同一处理器内核中的两个逻辑处理器上执行的软件线程,等待锁定被释放。这种短等待循环往往会持续数十到数百个周期(即20-500个CPU周期),因此在性能方面,等待占用CPU比使用OS产生更有利。

4500 MHz Core i7 7700K处理器上的500个CPU周期为0.0000001秒,即1/100000000秒:CPU可以在500个CPU周期循环中每秒进行1000万次。

如您所见,此PAUSE指令适用于时段。

另一方面,每次调用像Sleep()这样的API函数都会遇到上下文切换的昂贵代价,这可能是10000多个周期;它也会受到环3到0转换的成本,这可能是1000多个周期。

如果有更多线程,则处理器核心(乘以超线程功能,如果存在)可用,并且线程将在关键部分的中间切换到另一个线程,等待来自另一个线程的临界区域真的需要 looong ,至少有10000多个周期,所以PAUSE指令将是徒劳的。

请参阅此文章了解更多信息:

当等待循环预计持续数千个周期或更长时间时,它就是 最好通过调用OS同步API函数之一(例如Windows操作系统上的WaitForSingleObject)来屈服于操作系统。

作为结论:在您的场景中,PAUSE指令不是最佳选择,因为您的等待时间很长,而PAUSE用于非常短的循环。 PAUSE只有131个周期的SkyWell或更高版本的处理器。例如,英特尔酷睿i7-7700K CPU @ 4.20GHz Kaby Lake只需31.19ns。

在像Haswell这样的早期处理器上,我有大约9个周期。英特尔酷睿i5-4430 @ 3GHz为2.81ns。因此,对于长循环,最好使用OS同步API函数将控制权交给其他线程,而不是使用PAUSE循环占用CPU。

答案 3 :(得分:1)

PAUSE指令似乎也用于超线程处理器,以减轻对其他超线程的性能影响,可能是放弃了更多的CPU时间。

以下英特尔文章概述了这一点,并且毫不奇怪地建议在此类处理器上避免繁忙的等待循环:https://software.intel.com/en-us/articles/long-duration-spin-wait-loops-on-hyper-threading-technology-enabled-intel-processors