clwb 是否负责写入存储缓冲区?

Does clwb take care of the write in store buffer?

Intel 软件手册说 clwb将缓存行(如果已修改)写回内存,其中包含由任何级别的内存操作数指定的线性地址高速缓存一致性域中的高速缓存层次结构。该行可能会以未修改状态保留在高速缓存层次结构中。clwb 是根据对正在写回的高速缓存行的较旧写入进行排序的 "

我的问题是,在下面的伪代码中

write(A)
clwb (A)

clwb 是否负责写入存储缓冲区?或者在使用 clwb 之前,我是否需要在写入之后进行防护,例如

write (A)
sfence
clwb (A)

我想知道是否真的需要“sfence”? 谢谢

在 Intel 处理器上,clwb 指令相对于对同一缓存行的旧写入进行排序。在 AMD 处理器上,根据第 24593 号 AMD 手册第 2 卷第 7.6.3 节,如果目标地址的内存类型是执行 clwb 指令时的可缓存内存类型(即 WB、WT 或 WP)。

这个顺序保证意味着如果需要的话,在退出 clwb操作说明。请注意,持久域由平台定义。

这是我对后续问题的回答:这是否意味着,如果我有单线程执行,那么操作的正确性“store A, clwb (A), store B, clwb (B) " 在 Intel X86-64 上不使用 sfence 进行维护,因为 TSO 确保 store(A) 到 store(B) 已订购,clwb(A) 与 store(A) 一起订购,而 clwb(B) 与 store( B)

如果 clwb 指令刷新不同的缓存行,则它们不会相互排序。 TSO 仅保证存储按程序顺序退出(即按程序顺序写入缓存)。因此,在您的示例中,在缓存层次结构中,存储 A 总是在存储 B 之前完成,但是存储 B 可以在存储 A 之前到达内存(易失性或非易失性)。如果您只想在缓存中保留回写顺序层次结构,不需要栅栏。

但是如果需要保证store A总是先于store B到达内存,则需要在clwb(A)和store(B)之间插入一个sfence