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

clwb+sfence, can we remove sfence if writes are cache-line aligned?

根据 clwb 排序信息 (link),

"CLWB 指令仅按存储防护操作排序。例如,软件可以使用 SFENCE、MFENCE、XCHG 或 LOCK 前缀指令来确保先前的存储包含在写入中-back。CLWB 指令不需要由另一个 CLWB 或 CLFLUSHOPT 指令排序。CLWB 与逻辑处理器执行的旧存储隐式排序到同一地址。"

如果 Intel X86-64 上的操作集如下,我可以删除“sfence”并仍然确保正确性如果写入 ( A) 和 write(B) 缓存行对齐.

我问这个是因为在 Intel 上 Write(A) 和 write(B) 是有序的 (TSO) 和 write(A)->clwb( A)write(B)->clwb(B) 按照上面引用的 clwb[=12 的描述排序=]

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

我正在做以下假设

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

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

对于都在 相同 缓存行内的 WB 内存的正常存储:是的持久性顺序与 x86-TSO 全局可观察性顺序匹配,请参阅 。否则无法保证。

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

如果没有 SFENCE,在崩溃后它 可以看到 B 而不是 A 的效果。clwb 没有被排序,所以后面的可以首先使其存储持久化。这就是手册所指出的 clwb 缺乏订购 wrt。普通商店。

So according to TSO write(B) happened means write(A) happened (may be it is in store buffer).

不,x86-TSO 排序是关于从存储缓冲区到全局可观察性指针 L1d 的提交顺序。这当然与最终写回(通过逐出或 clwb)到 DRAM 完全不同。 Store uops 可以以任何顺序 执行 (将它们的地址+数据写入存储缓冲区),但直到退休后才能提交(即当它们是 时)。此外,该提交仅限于按程序顺序发生,即存储缓冲区条目的顺序是在 issue/rename/allocate.

期间分配的

meaning write(A)->write(B) are ordered and write(B)->clwb(B) are ordered, so how can clwb(B) bypass write(B) [thus violating the order constrain of manual] and happen before clwb(A) , thus causing effect of clwb(B) visible after a crash and not clwb(A)?

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

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

  • A 和 B 按某种顺序执行
  • A 和 B 一旦该核心拥有各自线路的 MESI 独占所有权,就会提交到 L1d 缓存,从而对其他核心全局可见。
  • clwb 指令在某个时刻执行,请求在存储提交后的某个时刻将缓存行写回 DRAM。
  • A 行的回写在它提交给 L1d 之后的某个时间点开始,B 行也是如此。它们可以以任一顺序开始,因为不能保证 clwb 的顺序。对其他行的其他 clwb 操作,尽管实际上它们可能 start 在程序中。
  • 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 的操作,它不会一直坚持下去。 clwb 允许在其他后来的商店之后“发生”。商店 B 到另一个地址,所以它不订购 clwb A.

SFENCE 可以防止这种情况。