有没有一种合理的方法,使 Linux 用户空间程序能够启用/禁用缓存写组合,适用于它所拥有的内存页?
我关心的两个目标系统:在3.0内核上的Intel Haswell处理器和在4.8内核上的Intel Skylake处理器。
我正在调整一个成熟的、多线程的应用程序,该应用程序使用大型缓冲区在生产者和消费者之间传输数据。根据剖析,我有理由相信,这个应用程序会从缓冲区的页面有时使用写组合缓存而不是写回缓存中受益。
我考虑改用非暂态写入来填充缓冲区,但这将需要比我的当前努力更大的代码重构。
我关心的两个目标系统:在3.0内核上的Intel Haswell处理器和在4.8内核上的Intel Skylake处理器。
我正在调整一个成熟的、多线程的应用程序,该应用程序使用大型缓冲区在生产者和消费者之间传输数据。根据剖析,我有理由相信,这个应用程序会从缓冲区的页面有时使用写组合缓存而不是写回缓存中受益。
我考虑改用非暂态写入来填充缓冲区,但这将需要比我的当前努力更大的代码重构。
这个问题, 这个问题, 以及这篇LWN文章从设备驱动程序的角度讨论了这个问题。而我所涉及的情况是,我正在使用用户空间代码,并以非root身份运行。
这篇2008年的论文讨论了控制页面缓存模式的不同API。它似乎表明,用户空间应用程序可以使用mmap
(参见5.3、5.4和5.6节)获得写组合访问权限,但是文档并不清楚(至少对我来说不是很清楚)如何使用这些机制。
/proc
//sys
fs 访问PCI资源的方法;5.5和5.6节介绍了通过/dev/mem
访问所有计算机内存的方法。这两种方法都需要root访问权限,而直接访问/dev/mem
是不安全的。尝试使用"非暂态写入(non-temporal writes)",至少比较一下改变代码的写入模式是否有好处。Intel有内存填充的硬件检测器,可以更改组合模式,详情请参考http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf 3.6.10 7.4.1 - osgx