gpt4 book ai didi

assembly - 哪个是 x86 : lock+addl or xchgl? 上更好的写屏障

转载 作者:行者123 更新时间:2023-12-03 11:21:16 31 4
gpt4 key购买 nike

Linux 内核使用 lock; addl $0,0(%%esp)作为写屏障,而 RE2 库使用 xchgl (%0),%0作为写屏障。有什么区别,哪个更好?

x86 是否也需要读屏障指令? RE2 将其读取屏障功能定义为 x86 上的无操作,而 Linux 将其定义为 lfence或 no-op 取决于 SSE2 是否可用。什么时候lfence必需的?

最佳答案

如果我们在 (%%esp) 地址测试锁变量的 0 状态,“ lock; addl $0,0(%%esp) ”会更快。因为我们将 0 值添加到锁定变量,并且如果地址 (%%esp) 处变量的锁定值是 0,则零标志设置为 1。

围栏来自英特尔数据表:

Performs a serializing operation onall load-from-memory instructions thatwere issued prior the LFENCEinstruction. This serializingoperation guarantees that every loadinstruction that precedes in programorder the LFENCE instruction isglobally visible before any loadinstruction that follows the LFENCEinstruction is globally visible.


( 编者注: mfence lock ed 操作是唯一有用的栅栏(在存储之后)用于顺序一致性 lfence 不会阻止存储缓冲区对 StoreLoad 的重新排序。)

例如:像“mov”这样的内存写入指令是原子的(它们不需要锁定前缀),如果它们正确对齐。但是这条指令通常在 CPU 缓存中执行,此时对于所有其他线程不会全局可见,因为必须先执行内存栅栏,以使该线程等待,直到之前的存储对其他线程可见。

所以这两条指令的主要区别在于 xchgl 指令不会对条件标志产生任何影响。当然我们可以用 来测试锁变量状态锁 cmpxchg 指令,但这仍然比 更复杂锁加 $0 操作说明。

关于assembly - 哪个是 x86 : lock+addl or xchgl? 上更好的写屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4232660/

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