在Linux用户空间应用程序中启用写组合?

6
有没有一种合理的方法,使 Linux 用户空间程序能够启用/禁用缓存写组合,适用于它所拥有的内存页?
我关心的两个目标系统:在3.0内核上的Intel Haswell处理器和在4.8内核上的Intel Skylake处理器。
我正在调整一个成熟的、多线程的应用程序,该应用程序使用大型缓冲区在生产者和消费者之间传输数据。根据剖析,我有理由相信,这个应用程序会从缓冲区的页面有时使用写组合缓存而不是写回缓存中受益。
我考虑改用非暂态写入来填充缓冲区,但这将需要比我的当前努力更大的代码重构。

这个问题, 这个问题, 以及这篇LWN文章从设备驱动程序的角度讨论了这个问题。而我所涉及的情况是,我正在使用用户空间代码,并以非root身份运行。

这篇2008年的论文讨论了控制页面缓存模式的不同API。它似乎表明,用户空间应用程序可以使用mmap(参见5.3、5.4和5.6节)获得写组合访问权限,但是文档并不清楚(至少对我来说不是很清楚)如何使用这些机制。


1
文档https://www.kernel.org/doc/ols/2008/ols2008v2-pages-135-144.pdf的5.3 5.4节介绍了通过/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
@osgx 所以用户空间的PAT/MTRR编程通常是不鼓励的...? - St.Antario
1个回答

4
最近我有一个类似的需求,需要在缓存密集的多线程应用程序中尝试未缓存内存。我开发了这个内核模块,它允许在用户空间映射未缓存的内存。所以它与您要求的有点不同,但也许您可以调整它来实现您的目标。将其调用:set_memory_wc()而不是set_memory_uc()pgprot_writecombine()而不是pgprot_uncached(),然后您应该获得写组合内存。目前,您必须mmap()模块的字符设备(请参见演示的test目录),并且内存类型是固定的,但添加一个ioctl来切换它不应该太难。我还没有尝试更改现有用户空间页面的属性,这将使其更加易于使用!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接