英特尔软件手册中指出,clwb "将包含内存操作数所指定的线性地址的缓存行(如果已修改)写回到缓存层次结构中任何级别的缓存一致性域。该行可能以非修改状态保留在缓存层次结构中。clwb与写回缓存行的旧写入操作有序"
我的问题是,在下面的伪代码中:
write(A)
clwb (A)
clwb会处理写入存储缓冲区吗?还是在使用clwb之前需要进行写入后sfence,例如
write (A)
sfence
clwb (A)
我想知道是否实际上需要 "sfence"?谢谢。
英特尔软件手册中指出,clwb "将包含内存操作数所指定的线性地址的缓存行(如果已修改)写回到缓存层次结构中任何级别的缓存一致性域。该行可能以非修改状态保留在缓存层次结构中。clwb与写回缓存行的旧写入操作有序"
我的问题是,在下面的伪代码中:
write(A)
clwb (A)
clwb会处理写入存储缓冲区吗?还是在使用clwb之前需要进行写入后sfence,例如
write (A)
sfence
clwb (A)
我想知道是否实际上需要 "sfence"?谢谢。
clwb
指令与先前写入同一缓存行的旧写入有序。根据 AMD 手册 No. 24593 的第 2 卷第 7.6.3 节,如果目标地址的内存类型是可缓存的内存类型(即 WB、WT 或 WP)在执行 clwb
指令时,则在 AMD 处理器上,clwb
指令与先前写入同一缓存行的旧写入有序。clwb
指令后某个时间点将被写回到持久性域中。请注意,持久性域由平台定义。
clflush
、clflushopt
或clwb
操作之前不需要使用sfence
。如果存储缓冲区存在问题,sfence
可能会在存储缓冲区实际排空之前从乱序执行后端中退出;如果硬件根本没有捕获到相关性,您可能需要使用mfence
,以确保在将存储数据提交到 L1d 缓存之前阻止clwb
实际执行。但像我说的那样,我很确定你什么都不需要。 - Peter Cordes