为什么hint::spin_loop在aarch64上使用ISB?

Bła*_*lik 7 assembly spinlock rust arm64 armv8

其中有std::hint一个函数,其文档spin_loop中具有以下定义:

\n
\n

发出机器指令,向处理器发出信号,表明它正在忙等待自旋循环中运行 (\xe2\x80\x9cspin lock\xe2\x80\x9d)。

\n

在接收到自旋循环信号后,处理器可以通过例如节省功率或切换超线程来优化其行为。

\n
\n

根据目标架构,这会编译为

\n\n

最后一个让我有点头晕()。我认为这ISB是一个冗长的操作,这意味着,如果在自旋锁中使用,线程在尝试检测锁是否再次打开时会有点滞后,但除此之外几乎没有任何利润。

\n

ISB SY在 aarch64 上使用in 代替 a NOPin spin 循环有什么优点?

\n

Bła*_*lik 4

我必须深入研究 Rust 存储库历史才能得到这个答案:

yield替换isbc064b6560b7c

在arm64上,我们在几个数据库上看到ISB(指令同步屏障)比自旋循环中的yield更好用。Yield 指令是一个 nop 指令。isb 指令使处理器短暂休眠。isb 相当于 x86 上的暂停指令。

[...]

因此本质上,它利用完成所需的时间ISB来暂停处理器,从而浪费更少的电量。

Peter Cordes 在他的一篇评论中很好地解释了这一点:

ISB SY 不会长时间停滞,只是在紧密循环中与垃圾邮件负载相比节省了一点电量。