X86 TLB invlpg指令具有较长的延迟

X86 TLB invlpg指令具有较长的延迟,x86,virtual-memory,tlb,X86,Virtual Memory,Tlb,因此,我正在研究这个内核模块,它执行一些页表操作,我注意到刷新TLB条目的速度很慢。你问得有多慢?每次呼叫invlpg超过100纳秒!这是280个周期或更多。我愿意接受这一点……但对于硬件支持的分页和地址转换,这似乎违反直觉。有人知道为什么这么糟糕吗 我运行的是4核2.8 Ghz Intel core i5,我想这样的特权指令在任何实际工作负载的CPU总时间中很少占很大一部分,因此不值得花大量的硅来提高它们的速度 使它们非序列化意味着无序的uop调度逻辑必须跟踪页表修改,作为每个内存uop的依赖

因此,我正在研究这个内核模块,它执行一些页表操作,我注意到刷新TLB条目的速度很慢。你问得有多慢?每次呼叫invlpg超过100纳秒!这是280个周期或更多。我愿意接受这一点……但对于硬件支持的分页和地址转换,这似乎违反直觉。有人知道为什么这么糟糕吗


我运行的是4核2.8 Ghz Intel core i5,我想这样的特权指令在任何实际工作负载的CPU总时间中很少占很大一部分,因此不值得花大量的硅来提高它们的速度

使它们非序列化意味着无序的uop调度逻辑必须跟踪页表修改,作为每个内存uop的依赖项之一。这将对功耗产生负面影响,因为重新排序的缓冲区已经需要跟踪很多内容,并且每个周期支持4个输入和超过4个输出


在最近的设计中,虚拟化的广泛使用导致了这些指令的性能改进,因为在某些工作负载中,virt开销是一个问题。我想这不是早期奔腾(1993年)的
invlpg

的情况,它更快:“invlpg…25个时钟周期”。可能它也是微代码,它正在序列化指令(),因此它将阻塞整个管道(20+个阶段)和所有重新排序的硬件。这意味着,将执行之前的所有指令并存储其结果(不保留正在运行的存储缓冲区);并且不会计划下一个指令。您可以将其速度与CPUID序列化指令进行比较。还有一些理论认为,invlpg需要进行TLB表格漫游(逐条输入);或者有很多对大页面的特殊处理(2-4MB的超级页面,有时是1GB)。蒂莫托:我可以问一下你是如何进行这些测量的吗@osgx:我想在更改任何地址转换时,停止管道是必要的?你有那些理论的参考资料吗?