英特尔内存模型保证:
http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/
我已经看到声称由于Intel内存模型,SFENCE在x86-64上是多余的,但从来没有LFENCE.上述内存模型规则是否使指令冗余?
我想知道的是lock xchg,mfence从一个线程访问内存位置的角度来看是否会有类似的行为,这个内存位置正在被其他线程进行变异(让我们随便说).它能保证我获得最新的价值吗?之后的内存读/写指令?
我混淆的原因是:
8.2.2"读取或写入不能通过I/O指令,锁定指令或序列化指令重新排序."
-Intel 64 Developers Manual Vol.3
这是否适用于线程?
mfence 状态:
对MFENCE指令之前发出的所有内存加载和存储到内存指令执行序列化操作.此序列化操作保证在MFENCE指令之前的任何加载或存储指令全局可见之前,在程序顺序之前的每条加载和存储指令都是全局可见的.MFENCE指令针对所有加载和存储指令,其他MFENCE指令,任何SFENCE和LFENCE指令以及任何序列化指令(例如CPUID指令)进行排序.
-Intel 64 Developers Manual Vol 3A
这听起来更有力.因为它听起来mfence几乎正在刷写写缓冲区,或者至少延伸到写缓冲区和其他内核以确保我未来的加载/存储是最新的.
当基准标记时,两个指令都需要约100个循环才能完成.所以我无论如何都看不出那么大的差异.
主要是我只是困惑.我的指令基于lock互斥体使用,但后来这些包含没有内存栅栏.然后,我看到锁免费使用内存栅栏编程,但没有锁.我知道AMD64有一个非常强大的内存模型,但过时的值可以在缓存中持续存在.如果lock行为与行为不同,mfence那么互斥量如何帮助您查看最新值?
x86 assembly multithreading cpu-architecture memory-barriers
我已经阅读了很多关于内存排序的文章,并且所有这些文章都只说CPU重新加载和存储.
CPU(我对x86 CPU特别感兴趣)是否仅重新排序加载和存储,并且不重新排序它具有的其余指令?
在x86上,除了原子操作之外,还提供了lock诸如lock cmpxchg提供屏障语义之类的前缀指令:对于回写内存区域的正常内存访问,读取和写入不是lock按照第3卷第8.2.2节中的预定指令重新排序的英特尔SDM:
无法使用I/O指令,锁定指令或序列化指令对读取或写入进行重新排序.
本节仅适用于回写内存类型.在同一个列表中,您会发现一个例外情况,它指出没有订购弱排序的商店:
- 读取不会与其他读取重新排序.
- 写入不会与较旧的读取重新排序.
- 写入内存不会与其他写入重新排序,但以下情况除外: -
使用非时间移动指令(MOVNTI,MOVNTQ,MOVNTDQ,MOVNTPS和MOVNTPD)执行的流存储(写入); 而且 -
字符串操作(参见第8.2.4.1节).
注意,列表中的任何其他项目中的非时间指令没有例外,例如,在涉及锁定前缀指令的项目中.
在本指南的各种其他部分中,提到当使用弱有序(非时间)指令时,mfence和/或sfence指令可用于命令存储器.这些部分通常不提及lock- 作为替代的前缀指令.
所有这一切都让我不确定:do lock-prefixed指令提供了相同的完整屏障,它mfence提供了WB内存上的弱有序(非时间)指令之间的?同样的问题再次适用于WC内存的任何类型的访问.