3

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

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

write(A)
clwb (A)

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

write (A)
sfence
clwb (A)

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

4

2 回答 2

4

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

clwb这种排序保证意味着,在指令退出后的某个时间点,如有必要,该行的最新状态或与程序顺序有关的后续状态最终将被写回持久性域。请注意,持久域是由平台定义的。

于 2020-12-05T12:49:43.357 回答
1

这是我对后续问题的回答:这是否意味着,如果我有一个单线程执行,那么操作“存储A,clwb(A),存储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 之前到达内存(易失性或非易失性)。如果您只想在缓存中保持回写顺序层次结构,不需要sfence。

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

于 2021-09-02T22:48:35.890 回答