1
8
“ 锁定;添加$0,0(%%esp) “如果我们在(%%esp)地址测试锁变量的0状态,则速度更快。因为我们将0值添加到锁变量,如果地址(%%esp)处变量的锁值为0,则零标志设置为1。 篱笆 从Intel数据表:
(
编者按:
例如:“mov”之类的内存写入指令是原子的(它们不需要锁前缀),如果它们正确对齐。但此指令通常在CPU缓存中执行,此时对于所有其他线程来说,它将不全局可见,因为必须首先执行内存隔离,以使此线程等待,直到其他线程看到以前的存储。 所以这两个指令的主要区别是 XCHGL 指令对条件标志没有任何影响。当然,我们可以用 锁定cmpxchg 但这仍然比 加锁$0 说明。 |
2
10
引用IA32手册(第3a卷,第8.2章:内存排序):
注意:上面的“在单处理器系统中”有些误导。每个(逻辑)处理器都有相同的规则;然后手册将继续描述多个处理器之间的额外排序规则。关于这个问题,唯一的一点是
简而言之,只要你写回内存(只要你不是驱动程序或图形程序员,这就是你所能看到的所有内存),大多数x86指令几乎是顺序一致的-唯一可以重新排序的x86 CPU可以执行的是以后重新排序(独立的)读取以执行在写之前。写障碍的主要原因是它们有一个
而且,在写回内存中,读取永远不会被重新排序,因此不需要设置读取障碍。最近的x86处理器对于流存储和写入组合内存(通常用于映射的图形内存)具有较弱的内存一致性模型。在那里各种各样的
|
3
7
用例是当您需要阻止StoreLoad重新排序(x86的强内存模型所允许的唯一类型)时,但是您不需要对共享变量执行原子的RMW操作。 https://preshing.com/20120515/memory-reordering-caught-in-the-act/
例如,假设对齐
您的选择是:
你只能用
如果可能,使用
它甚至值得使用
序列化无序执行(但不是存储缓冲区)对于停止存储负载重新排序(x86的强内存模型只允许正常的WB(写回)内存区域)没有帮助。
的实际用例
另请参见
When should I use _mm_sfence _mm_lfence and _mm_mfence
(我的答案和@beeonrope的答案)了解更多原因
|
4
6
除了其他答案,热点开发人员发现
在某些情况下,使用不同偏移量触摸堆栈位置可以提高性能。 |
5
2
的重要部分
SSE2的存在可能只是真实条件的一个代理,它最终是
|
Anon. · 用汇编语言解释这一行? 6 年前 |
wangt13 · 如何使用VMX暂停和恢复VM 6 年前 |
Kay · Skylake和更新的环形巴士 6 年前 |
Kadir · Intel芯片上的半精度浮点算法 6 年前 |
Some_Dude · x86汇编牛顿平方根算法寄存器为1#IND 6 年前 |