提问者:小点点

clwb栅栏,如果写入是缓存行对齐的,我们可以删除栅栏吗?


根据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)

我做了如下假设

  1. 编译器不会重新排序这些操作
  2. clwb()指令将脏线写回持久域,因此写入(A)-

请告诉我删除Geofence是否会破坏正确性?如果是,在什么情况下谢谢


共1个答案

匿名用户

对于在同一缓存行中的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的操作顺序如下:

  • A和B以某种顺序执行
  • 一旦这个内核拥有各自行的MESI独占所有权,A和B就会提交到L1d缓存,对其他内核全局可见。
  • clwb指令在某个时刻执行,请求在存储提交后的某个时刻将缓存行写回DRAM。
  • 第A行的写回在它提交到L1d之后的某个时间开始,第B行也是如此。它们可以按任一顺序开始,因为clwb的顺序不能保证。对其他行的其他clwb操作,尽管实际上它们可能以程序oder开始。
  • clwb-B结束变得持久
  • 机器断电,在运行中的clwb-A进入持久性域之前。您没有请求clwb操作被排序wr。彼此,所以这是允许的。

在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可以防止这种情况。