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 感谢您的评论,但请问您为什么使用mfenceclflush(不像clflushopt)有严格的内存排序保证。 哎呀,我不记得哪个是订购的,哪个不是。谢谢你记得我:) 【参考方案1】:

clflush 执行它在锡上所说的并刷新所有缓存:指令、数据和统一。(以及解码的微指令缓存)。玛格丽特布鲁姆其实是tested to confirm this。

指令缓存永远不会是脏的,所以讨论修改的行讨论数据是有道理的。只有回写数据缓存可以是脏的。请注意,clflush 的预期目的之一是将脏数据写回非易失性 DIMM,因此文档关注数据是很自然的。

您对措辞的阅读过多,可能是基于一种误解,即回写与刷新同义。 一个干净的缓存行(例如 I-cache)可以通过简单的删除来刷新,不需要写回。注意invdwbinvd 之间的区别。 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?的主要内容,如果未能解决你的问题,请参考以下文章

void _mm_clflush(void const*_P)

动态监控 rdtsc 的性能

操作系统基础

操作系统基础

如何检查刷新控件是不是在其目标操作方法中刷新

如果颁发了新的刷新令牌,旧的刷新令牌是不是仍然有效?