刷新cpucaching而不调用caching?

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

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

我已经看过clflush_cache_range(),但该方法使用clflushopt指令,我相信会使caching无效。

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

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

CLWB:

CLWB就像CLFLUSH一样,它强制数据被写入内存。 但是,它不会强制高速缓存丢弃数据,这使得将来的读写速度要快很多。 此外,CLFLUSH仅针对MFENCE订购,但CLWB也针对SFENCE订购。

和PCOMMIT:

PCOMMIT应用于整个内存范围,并确保内存范围内的所有内容都被提交到持久性存储。

这两个不同的内存和存储类型,以及其他一些微妙之处,如他们如何订购击剑或其他商店。 完整的描述在手册中。