因此,我正在对该内核模块进行一些页表操作,并且注意到刷新TLB条目的速度很慢。你问多慢?每次调用invlpg都超过100 ns!那是280个循环或更多。我愿意接受这一点...但是对于硬件支持的分页和地址转换,这似乎违反直觉。有人知道为什么这很糟糕吗?
我在4核2.8 GHz英特尔酷睿i5上运行
最佳答案
我的猜测是,像这样的特权指令几乎不会占任何实际工作负载的总CPU时间的大部分,因此,不值得花费使它们变得更快所需的硅数量。
使它们不进行序列化将意味着无序的uop调度逻辑将必须跟踪页表修改,这是每个内存uop的依赖项之一。这将对功耗产生负面影响,因为重新排序缓冲区已经需要跟踪很多东西,并且每个周期支持4个输入和大于此的输出。
虚拟化的广泛使用已导致最近设计中这些指令的性能提高,因为虚拟化开销是某些工作负载中的一个问题。我想invlpg
并非如此。
关于x86 - TLB invlpg指令具有较长的延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13077883/