根据 clwb 订购信息(链接),
" CLWB 指令仅按存储屏蔽操作排序。例如,软件可以使用 SFENCE、MFENCE、XCHG 或 LOCK 前缀指令来确保回写中包含以前的存储。CLWB 指令不需要按以下顺序排序“ _
如果 Intel X86-64 上的操作集如下所示,如果写入 (A) 和写入 (B) 是高速缓存行对齐的,我是否可以删除“ sfence ”并仍然确保正确性。
我问这个是因为在英特尔Write(A) 和 write(B)上是有序的 (TSO) 和write(A)->clwb(A)和write(B)->clwb(B)是按照上面引用的描述排序的clwb _
write(A)
clwb(A)
sfence()
write(B)
clwb(B)
我正在做以下假设
- 编译器不会重新排序这些操作
- clwb() 指令将脏行写回到持久域,因此write(A)->clwb(A)对确保 A 的修改值在持久域中
请告诉删除sfence是否会破坏正确性?如果是,在什么情况下谢谢