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



根据clwb订购信息(链接),

">CLWB指令仅由存储围栏操作命令。例如,软件可以使用以SFENCE、MFENCE、XCHG或LOCK为前缀的指令来确保以前的存储包含在回写中。CLWB指令不需要由另一个CLWB或CLFLUSHOPT指令来排序。CLWB是用逻辑处理器执行的旧存储对同一地址进行隐式排序的";

如果英特尔X86-64上的操作集如下sfence";并且如果写入(A)和写入(B)是高速缓存行对齐的,则仍然确保正确性。

我之所以问这个问题,是因为在英特尔上,写入(A)和写入(B)是有序的(TSO)和写入(A;clwb(A)写入(B)->clwb(B)按照上述clwb的描述进行订购

write(A)
clwb(A)
sfence()
write(B)
clwb(B)

我正在做以下假设

  1. 编译器不重新排序这些操作
  2. clwb()指令将脏行写回持久域,因此write(A)->clwb(A)对确保A的修改值在持久域中

请告知删除sfence是否会破坏正确性?如果是,在什么情况下感谢

对于在同一缓存行内的WB内存的正常存储:yes持久性顺序与x86 TSO全局可观察性顺序匹配,请参阅系统崩溃时clflush或clflushopt是原子的吗。否则就不能保证。

您的意思似乎是A完全包含在一个缓存行中,而B则包含在单独的缓存行中。

如果没有SFENCE,崩溃后可以看到B的效果,但不能看到a的效果。clwb没有排序,所以后面的一个可以首先使其存储持久化。这就是手册所指出的,clwb没有向普通商店订购。

因此,根据TSO,发生写(B)意味着发生写(A)(可能是在存储缓冲区中)。

否,x86 TSO排序是关于从存储缓冲区到L1d的提交顺序,L1d是全局可观察性的指针。当然,这与DRAM的最终回写(通过逐出或clwb)是完全不同的。存储uop可以以任何顺序执行(将其地址+数据写入存储缓冲区),但直到退休后才能提交(即,当它们是非推测性的)。此外,该提交被限制为按程序顺序进行,即订单存储缓冲区条目是在发布/重命名/分配期间分配的。

意思是写(A)->write(B)被排序,并且write(A)->clwb(B?

使用旧商店隐式订购。。。到相同的地址";规则只保证将store+clwb存储到同一地址将写回包含该存储数据的行的版本。否则,它可能会在最新的存储仍在存储缓冲区中或甚至未执行时写回该行的副本。这并不意味着整个写回必须在任何后续存储之前完成

崩溃后产生B但不可见A的操作顺序如下:

  • A和B按某种顺序执行
  • 一旦该核心对其各自的行拥有MESI独占所有权,A和B就提交到L1d缓存,从而对其他核心全局可见
  • 在某个时刻执行的clwb指令,请求在存储提交后的某个时刻将缓存线写回DRAM
  • A行的回写在提交到L1d之后的某个时刻开始,B行也是如此。它们可以按任意顺序开始,因为clwb的顺序不能保证将其他clwb操作写入其他行,尽管在实践中它们可能会在程序顺序中开始
  • clwb-B完成持久化
  • 在飞行中的clwb-A进入持久性域之前,机器失去了电源。您没有请求将clwb操作按顺序排列,因此这是允许的

在asm指令重新排序方面,允许以下重新排序:

store A
store B
clwb  B
clwb  A     ; not ordered wrt. store B or clwb B

当然,执行顺序与到达存储缓冲区的末尾与实际的持久提交都是分开的,至少在理论上是这样,但如果你想将其简化为一条指令的所有步骤发生在另一条指令产生任何影响之前,这种重新排序仍然与所有规则兼容。

我认为你缺少的关键是clwb A是一个与商店A独立的操作,它不会一直坚持下去;发生";之后的其他商店。商店B的地址不同,所以它不订购clwb a.

SFENCE可以防止这种情况。

相关内容

  • 没有找到相关文章

最新更新