![]() |
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的存在可能只是真实条件的一个代理,它最终是
|
![]() |
M Rajoy · DOS中断10与AX 700 6 月前 |
![]() |
Imyaf · 在什么条件下,在组装时对“if”和“if-else”进行比较? 10 月前 |
|
Anonymous · 程序计数器的下一个指令是什么? 10 月前 |
![]() |
Daniel Langr · GCC不为类外默认复制构造函数生成机器代码 10 月前 |
![]() |
EE18 · C中字节序与尺寸组装转换的关系 11 月前 |