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

3

英特尔软件手册中指出,clwb "将包含内存操作数所指定的线性地址的缓存行(如果已修改)写回到缓存层次结构中任何级别的缓存一致性域。该行可能以非修改状态保留在缓存层次结构中。clwb与写回缓存行的旧写入操作有序"

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

write(A)
clwb (A)

clwb会处理写入存储缓冲区吗?还是在使用clwb之前需要进行写入后sfence,例如

write (A)
sfence
clwb (A)

我想知道是否实际上需要 "sfence"?谢谢。


3
我很确定在执行 clflushclflushoptclwb 操作之前不需要使用 sfence。如果存储缓冲区存在问题,sfence 可能会在存储缓冲区实际排空之前从乱序执行后端中退出;如果硬件根本没有捕获到相关性,您可能需要使用 mfence,以确保在将存储数据提交到 L1d 缓存之前阻止 clwb 实际执行。但像我说的那样,我很确定你什么都不需要。 - Peter Cordes
3
您引用的最后一句话在我的副本中略有不同:“CLWB隐含地按逻辑处理器执行的旧存储器对同一地址进行排序。”我认为这清楚地回答了您的问题,是吗?(我想知道哪个是更新的。我的版本是2019年5月的第70版,已经过时了。) - prl
@PeterCordes 感谢您的回复,祝您度过愉快的一天。 - Arun Kp
@prl 非常感谢,我指的是“订单号:325384-070US 2019年5月”。 - Arun Kp
1
你引用的段落不在Intel SDM修订版70中。你从哪里引用的? - prl
2个回答

4
在英特尔处理器上,clwb指令与先前写入同一缓存行的旧写入有序。根据 AMD 手册 No. 24593 的第 2 卷第 7.6.3 节,如果目标地址的内存类型是可缓存的内存类型(即 WB、WT 或 WP)在执行 clwb 指令时,则在 AMD 处理器上,clwb 指令与先前写入同一缓存行的旧写入有序。
此排序保证意味着缓存行的最近状态或者相对于程序顺序的较新状态,在退役 clwb 指令后某个时间点将被写回到持久性域中。请注意,持久性域由平台定义。

谢谢,这是否意味着如果我只有一个执行线程,则在Intel X86-64上不使用sfence的情况下,操作“store A,clwb(A),store B,clwb(B)”的正确性得到维护,因为TSO确保了store(A)到store(B)的顺序,并且clwb(A)与store(A)有序,clwb(B)与store(B)有序。 - Arun Kp

1
这是我对后续问题的回答:如果我只有一个执行线程,那么在Intel X86-64上,操作“store A,clwb(A),store B,clwb(B)”的正确性是否得到保证,因为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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接