根据clwb订购信息(链接),
"CLWB指令仅通过存储隔离操作排序。例如,软件可以使用SFENCE、MFENCE、XCHG或LOCK前缀指令来确保以前的存储包含在回写中。CLWB指令不需要由另一条CLWB或CLFLUSHOPT指令排序。CLWB与逻辑处理器执行到同一地址的旧存储隐式排序。"
如果Intel X86-64上的一组操作如下,如果写入(A)和写入(B)与缓存行对齐,我可以删除“Geofence”并仍然确保正确性吗?
我问这个问题,因为英特尔写(A)和写(B)是有序的(TSO)和写(A)-
write(A)
clwb(A)
sfence()
write(B)
clwb(B)
我做了如下假设
请告诉我删除Geofence是否会破坏正确性?如果是,在什么情况下谢谢
对于在同一缓存行中的WB内存的正常存储:是的持久性顺序匹配x86-TSO全局可观察性顺序,请参阅系统崩溃时是clflush还是clflushop原子?。否则这不能保证。
您的意思似乎是A完全包含在一个缓存行中,而B完全包含在一个单独的缓存行中。
如果没有SFENCE,崩溃后可能会看到B的效果,但看不到A。clwb
没有排序,所以后面的可以先使其存储持久化。这就是手册指出的clwb缺乏排序。正常存储。
所以根据TSO写(B)发生意味着写(A)发生了(可能是它在存储缓冲区中)。
不,x86-TSO排序是关于从存储缓冲区到L1d(全局可观察性指针)的提交顺序。这当然与最终回写(通过逐出或clwb)到DRAM完全不同。存储uops可以以任何顺序执行(将其地址数据写入存储缓冲区),但直到退役后才能提交(即当它们是非推测性的时)。此外,该提交被限制为按程序顺序进行,即在发行/重命名/分配期间分配存储缓冲区条目的顺序。
意思是写(A)-
不,“隐式订购旧存储…到同一地址”规则仅保证到同一地址的存储clwb将写回包含该存储数据的行版本。否则,它可以在最新存储仍在存储缓冲区中或甚至未执行时写回该行的副本。这并不意味着整个回写必须在任何后续存储之前完成!
崩溃后产生B但不可见A的操作顺序如下:
在asm指令重排序方面,允许进行以下重排序:
store A
store B
clwb B
clwb A ; not ordered wrt. store B or clwb B
当然,执行顺序与到达存储缓冲区末尾与实际持久提交至少在理论上都是独立的事情,但是如果你想将其简化为一条指令在另一条指令的任何影响之前发生的所有步骤,这种重新排序仍然与所有规则兼容。
我认为你忽略的关键是clwb A是一个独立于存储A的操作,它不会一直停留在它上面。该clwb被允许在其他后续存储之后“发生”。存储B位于不同的地址,因此它不会订购clwb A。
SFENCE可以防止这种情况。