clflush 是不是刷新 L1i?
Posted
技术标签:
【中文标题】clflush 是不是刷新 L1i?【英文标题】:Does clflush flush L1i?clflush 是否刷新 L1i? 【发布时间】:2020-06-13 13:47:18 【问题描述】:这是一个问题:clflush 是否刷新 L1i?英特尔 ISA 手册对此并不清楚:
从缓存中缓存层次结构的每一级失效 coherence domain 包含线性地址的缓存行 用内存操作数指定。如果该缓存行包含 在缓存层次结构的任何级别修改数据,该数据是 写回内存
我会根据措辞推测
如果该缓存行在任何级别包含修改过的数据 缓存层次结构,数据被写回内存。
所以 L1I 保持不变。这是英特尔 CPU 的实际行为吗?
【问题讨论】:
L1i 行似乎也被驱逐了。使用程序 here 运行perf stat -e mem_load_retired.l1_miss,frontend_retired.l1i_miss
将显示大约 10M L1d 和 L1i 未命中 lin 12 时 not 评论。否则只报告 2K 未命中(对于两个缓存)。
@MargaretBloom 感谢您的评论,但请问您为什么使用mfence
。 clflush
(不像clflushopt
)有严格的内存排序保证。
哎呀,我不记得哪个是订购的,哪个不是。谢谢你记得我:)
【参考方案1】:
clflush
执行它在锡上所说的并刷新所有缓存:指令、数据和统一。(以及解码的微指令缓存)。玛格丽特布鲁姆其实是tested to confirm this。
指令缓存永远不会是脏的,所以讨论修改的行讨论数据是有道理的。只有回写数据缓存可以是脏的。请注意,clflush
的预期目的之一是将脏数据写回非易失性 DIMM,因此文档关注数据是很自然的。
您对措辞的阅读过多,可能是基于一种误解,即回写与刷新同义。 一个干净的缓存行(例如 I-cache)可以通过简单的删除来刷新,不需要写回。注意invd
和wbinvd
之间的区别。 invd
文档使用“flush”作为“invalidate”的同义词。 (相关:What use is the INVD instruction?)
来自英特尔的 vol.2 ISA 参考手册 entry for clflush
CLFLUSH 指令可以在所有特权级别使用,并受到所有权限检查和与字节加载相关的错误(此外,CLFLUSH 指令允许在只执行中刷新线性地址段)。与加载一样,CLFLUSH 指令设置页表中的 A 位但不设置 D 位。
这并没有明确说它实际上刷新了这些区域中的 I-cache,但它暗示刷新与甚至不可能进行数据访问的情况有关。
半相关:Flush iCache in x86
【讨论】:
以上是关于clflush 是不是刷新 L1i?的主要内容,如果未能解决你的问题,请参考以下文章