performance - clflush 是否也会删除 TLB 条目?
问题描述
1是否也刷新关联的 TLB 条目?我假设不会因为以缓存行粒度运行,而 TLB 条目以(更大的)页面粒度存在 - 但我准备好感到惊讶了。clflush
clflush
1 ...或者clflushopt
尽管人们会合理地假设他们的行为是相同的。
解决方案
我认为可以安全地假设不;烘烤听起来像是一个疯狂invlpg
的clflush
设计决定,我认为没有人会做出。您经常希望使页面中的多行无效。也没有明显的好处。刷新 TLB 也不会更容易实现数据缓存刷新。
即使只是删除最终的 TLB 条目(不一定会使任何页面目录缓存无效)也会比它弱,invlpg
但仍然没有意义。
所有现代 x86 都使用带有物理索引/标记的缓存,而不是虚拟的。(VIPT L1d 缓存实际上是带有索引自由转换的 PIPT,因为它取自作为页面内偏移的一部分的地址位。)即使缓存是虚拟的,使 TLB 条目无效也需要使虚拟缓存无效,但反之则不然.
根据 IACA,clflush
在 HSW-SKL 上只有 2 uops,在 NHM-IVB 上只有 4 uops(包括微融合)。所以它甚至没有在英特尔上进行微编码。
IACA 不建模invlpg
,但我认为它更多的是 uops。(而且它具有特权,因此测试起来并非完全微不足道。)在 HSW 之前的那些额外的微指令很可能是用于 TLB 失效的。
我没有任何关于 AMD 的信息。
享有特权的事实invlpg
是另一个clflush
不希望成为它的超集的理由。 clflush
是无特权的。据推测,仅出于性能原因,invlpg
仅限于环 0。
但invlpg
不会出现页面错误,因此用户空间可以使用它来使内核 TLB 条目无效,从而延迟实时进程和中断处理程序。(wbinvd
由于类似的原因而享有特权:它非常慢,我认为不可中断。) clflush
在非法地址上会出错,因此它不会打开那个拒绝服务漏洞。不过,您可以clflush
共享 VDSO 页面。
除非 CPU 出于某种原因想要在用户空间中公开invlpg
(通过将其烘焙到 中clflush
),否则我真的不明白为什么任何供应商会这样做。
在未来的计算中使用非易失性 DIMM,任何未来的 CPU 都不太可能使循环在一定范围内的内存运行变得超慢clflush
。您希望大多数使用内存映射 NV 存储的软件都在clflushopt
使用clflush
.
推荐阅读
- html - 下拉菜单未对齐
- java - 我是否正在查看抛出的异常中提到的“编译器错误输出”?
- r - 从一行中减去秒并将结果设置为 R 中的另一行
- apache-kafka - 如何设置多代理 kafka 集群以避免 kafka 失败?
- postgresql - 使用 AWS DMS 从 DB2 到 PostgreSQL 的数据迁移 - Varchar 字段显示尾随空格
- r - Highcharter R中工具提示和轴的日期格式
- cuda - 带有 cuBLAS 的 cudaMallocManaged(统一内存)
- python-2.7 - 从 TCL shell 调用 python 时在 tcl shell 中执行命令
- flutter - 如何在 Flutter 的 BuildContext.select() 上监听类的变化?
- python - Python 排名不跳数(密集排名)