TLB invlpg指令具有较长的延迟时间

3

我正在开发一个内核模块,它需要进行一些页面表操作。我注意到刷新TLB条目很慢。你问我有多慢吗?每次调用invlpg需要超过100纳秒!这相当于280个周期以上。尽管我可以接受这种速度......但对于硬件支持的分页和地址转换来说,这似乎是违反直觉的。有人知道为什么会这么糟糕吗?

我的电脑配置是4核2.8 Ghz英特尔core i5。


在早期的奔腾处理器(1993年)中,速度更快:http://www.intel-assembler.it/portale/5/intel-pentium-instruction/cmpxchg8b-cpuid-mov-rdmsr-rdtsc-rsm-wrmsr.asp:“INVLPG ... 25个时钟周期”。可能是微码化的。http://lkml.org/lkml/2008/1/25/607 - osgx
1
另外,它是串行化指令(http://www.sandpile.org/x86/coherent.htm),因此它会阻塞整个管道(20+个阶段)和所有重排序硬件。这意味着,在此之前的所有指令都将被执行并且它们的结果将被存储(不保留在存储缓冲区中);而下一个指令将不会被计划。您可以将其速度与CPUID串行化指令进行比较。还有一些理论认为,invlpg需要进行TLB表遍历(逐个条目);或者存在大页面(2-4MB和有时1GB的超级页面)的许多特殊处理。 - osgx
Timoteo: 我可以问一下您是如何进行这些测量的吗?@osgx:我猜在更改任何地址转换时停止管道是必要的。您有这些理论的参考资料吗? - Daniel Jour
1个回答

2
我猜特权指令这样的指令很少占据任何实际工作负载的总CPU时间,因此不值得花费大量硅来使它们更快。
使它们非序列化意味着乱序uop调度逻辑必须跟踪页表修改作为每个内存uop的依赖项之一。这将对功耗产生负面影响,因为重排序缓冲区已经需要跟踪很多东西,并且每个周期支持4个输入和多个输出。
广泛使用虚拟化技术已经导致最近设计中这些指令的性能有所提高,因为虚拟化开销在某些工作负载中是一个问题。我猜这对于invlpg不是这种情况。

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