gpt4 book ai didi

c - x86 上交换与比较和交换锁的相对性能

转载 作者:太空狗 更新时间:2023-10-29 16:24:51 27 4
gpt4 key购买 nike

两个常见的锁定习语是:

if (!atomic_swap(lockaddr, 1)) /* got the lock */

和:

if (!atomic_compare_and_swap(lockaddr, 0, val)) /* got the lock */

其中 val 可以只是一个常量或锁的新潜在所有者的标识符。

我想知道的是,在 x86(和 x86_64)机器上,两者之间是否存在明显的性能差异。我知道这是一个相当广泛的问题,因为答案可能因不同的 cpu 型号而有很大差异,但这是我提出这个问题的部分原因,而不是仅仅对我可以访问的几个 cpu 进行基准测试。

最佳答案

我假设 atomic_swap(lockaddr, 1) 被翻译成 xchg reg,mem 指令,atomic_compare_and_swap(lockaddr, 0, val) 被翻译成 cmpxchg[8b|16b]。

一些 linux kernel developers认为 cmpxchg 更快,因为锁定前缀并不像 xchg 那样隐含。因此,如果您使用的是单处理器、多线程,或者可以通过其他方式确保不需要锁,那么使用 cmpxchg 可能更好。

但是您的编译器很可能会将它翻译成“lock cmpxchg”,在这种情况下它并不重要。另请注意,虽然此指令的延迟很低(无锁时为 1 个周期,有锁时约为 20 个周期),但如果您碰巧在两个线程之间使用公共(public)同步变量(这很常见),则会强制执行一些额外的总线周期,最后永远与指令延迟相比。这些很可能会完全被 200 或 500 个 cpu 周期长缓存监听/同步/内存访问/总线锁定/等等完全隐藏。

关于c - x86 上交换与比较和交换锁的相对性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5339769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com