在不调用缓存的情况下刷新cpu缓存?

时间:2015-09-02 19:25:08

标签: linux caching linux-kernel flush cpu-cache

我的环境是x86,Linux和内核空间。

我想知道是否有任何方法可以刷新内存区域的缓存而不会使缓存失效?

我查看了clflush_cache_range(),但该方法使用clflushopt指令,我相信这会使缓存失效。

1 个答案:

答案 0 :(得分:2)

在某些情况下,您确实希望确保在核心崩溃(可靠性)的情况下将数据写回内存,或者如果您正在处理事务并且您拥有某种版本化内存。在这些情况下,您希望通过将数据同步到内存来确保数据的一致性和持久性,但是您不希望因为刷新整个缓存甚至只是您正在处理的行而受到惩罚,因为你需要继续使用它。

在x86中,对于这种情况,您应该检查CLWB(缓存行WB)和PCOMMIT。两者都是最近发布的,所以在大多数现有产品中它们可能尚未得到支持(我已经看过一些可能的参考Skylake,但没有正式的)。这是一个很好的总结,包括一些性能分析 - http://danluu.com/clwb-pcommit/

CLWB:

  

CLWB就像CLFLUSH一样,它强制数据被写出来   记忆。但是,它不会强制缓存丢弃数据,   这使得未来的读写速度更快。另外,CLFLUSH是   仅针对MFENCE订购,但CLWB也订购   尊重SFENCE。

和PCOMMIT:

  

PCOMMIT适用于整个内存范围并确保一切   在内存范围内致力于持久存储。

这些2与他们正在使用的内存和存储类型不同,以及其他一些细微之处,例如他们如何针对击剑或其他商店订购。完整的描述在手册中。