2016-07-31 57 views
2

当我们要写数据项时,包含数据的块首先被带入缓存,数据项被写入缓存。这可能会导致缓存污染。为了避免这种情况,英特尔没有推出临时指令。当mmap()

如果我打算使用mmap()将数据写入文件并且永远不会再读取,是否可以避免为此创建TLB条目?是否有类似于非暂时指令的指令?

+1

不,我很确定没有,因为你不能使用巨大的页面文件支持的映射。使用'write'的缓冲区大小可能为1/2 L2高速缓存大小或类似的可能实际上表现更好;你应该测试。 (尽管在将缓冲区复制到页面缓存时内核概率不会使用NT存储)。如果通过使用madvise(MAD​​V_DONTNEED)来鼓励内核在将内容写入磁盘后将内容从RAM中删除,那么文件数据很可能不会被长时间引用,这样可以避免页面缓存污染。 –

+2

根据您的访问模式,pwrite()可能比write()更合适。但是,是的,你一定要测试。另一个建议是尽量确保所有的文件修改都发生在同一个CPU上以减轻污染。当文件未映射时,也不要忘记衡量任何最终TLB击落的成本。 – Pseudonym

回答

1

TLB条目是CPU需要从虚拟地址映射到物理地址的,因此无法通过mmap()或任何类似的API来避免它们。

即使有可能避免将映射存储在TLB中,每访问映射的内存也需要重新加载页表中的相应条目,因此性能会更差。 非暂时性访问仅适用于商店,但页表条目为请阅读

+1

你可以想象一个TLB条目的非时间提示,所以也许他们会被赶出去,或者只能呆在L1 TLB中,而不是在从L1 DTLB驱逐时转移到L2 TLB。这与PREFETCHNTA仅将数据带入L1中相似,而不会污染较大的L2。对于x86上的TLB条目,没有任何类似的机制,但这并不是因为不可能对非时间提示进行加载。 (好处是,TLB条目缓存加载,但不是商店,但)。 –