gpt4 book ai didi

c - 如何为某些内存区域禁用CPU缓存?

转载 作者:IT王子 更新时间:2023-10-29 00:31:31 38 4
gpt4 key购买 nike

我在Wikipedia上读到,禁用cpu-cache可以提高性能:

Marking some memory ranges as non-cacheable can improve performance, by avoiding caching of memory regions that are rarely re-accessed.



当我用谷歌搜索如何在Linux上的c语言中执行此操作时,我什么也没找到。不是我真的需要此功能,但是我仍然很感兴趣。

您知道使用此优化的任何项目吗?

编辑:我正在为x86_64编程

最佳答案

关于非缓存的评论并不表示您认为的含义,在不使用缓存的地方,它通常不是用户可访问的功能。即,CPU缓存控制通常是特权操作。

那就是...

-可以使用属性为“热”或“冷”的函数来构建普通用户程序,以使编译器告诉加载程序以最有用地利用缓存的方式对函数进行分组。

-普通程序可以使用linux中的madvise()函数来告诉分页函数各种事情,包括以下事实:刚刚使用的内存即将或不可能再次使用。

-内核本身在更高版本的内核中使用内存类型范围寄存器(mtrr)和页面属性表(pat)标志,以告知硬件特定的内存范围(例如内存映射的显示缓冲区以及内存的各个部分)。 PCI总线)将不被缓存。

像您可能在任何C程序中使用的“Normal Data™”基本上不会从标记其任何不值得缓存的数据中受益。未缓存数据带来的性能改进是随后缺少了内存映射的设备和显示缓冲区几乎始终需要的各种缓存刷新和内存屏障操作。例如,在内存映射的设备上放置缓存将需要在每次读取之前使用缓存无效命令,并在每次写入之后需要使用缓存强制写入命令,以确保读取和写入发生在所需的确切时间。这将“毒化”高速缓存的使用,以最不友好,最无益的方式耗尽并立即丢弃高速缓存行(物理上有限的资源)。

在极少数情况下,您编写的程序可以访问这些高速缓存有害区域之一(例如,如果您在Linux系统上编写了X显示服务器的一部分),内核将已经为设备设置了寄存器,并且非缓存行为对您是透明的。

实际上,普通的应用程序级程序几乎没有时间可以从任何将变量标记为有害缓存的功能中受益,而这些变量对各种使用madvise()的类型都是有害的。

即使在那时,您仍然可以从中受益的情况如此罕见,以至于如果您遇到了麻烦,问题集将包括需求和方法论作为研究的一部分,并且您将被告知如何以及为什么因此,您显然不需要问这个问题。

再回到同一示例,如果您正在编写必要的驱动程序,那么当您在显示适配器硬件或PCI总线上进行读取时,各种标志和技术将在硬件指南中进行记录和讨论。 。

有一些方法可以通过在Intel平台上执行CLCLEAR指令之类的操作,从用户空间中实现高速缓存弹出等功能。这些技术不会提高总体性能。

由于它是Linux系统上的特权操作,因此您可以编写一个内核驱动程序来获取并标记内存区域为不可缓存,然后将其映射到应用程序中。但是,对这样一个地区的需求非常少,并且很可能被滥用,以至于没有一个正常的方法来做到这一点。

你是怎么做到的?你不是,至少不是今天的你。当您成为具有多线程代码和数据同步问题的专业知识的内核驱动程序编写者时,您将知道如何做到这一点,届时您将知道为什么不想这样做。最后一招。

TL; DR::由于Linux使用和管理数据及代码的方式,将正常应用程序的任何部分标记为不可缓存不会带来任何好处,不会造成比保存起来更多的伤心欲绝。因此,没有非特权API可以执行此操作。

P.S.此外,也就是说,已经有人指出了导致本文http://lwn.net/Articles/255364/的内容,该文章涵盖了使程序对缓存非常友好的方法,以及一些可以非常廉价地执行某些缓存绕过操作的方法。例如,在设置内存时使用memset()往往会绕过缓存,并且某些操作会“流过”缓存。这与您要问的不一样,但是一旦您理解了所有文章,您将更好地理解为什么像Jedi所说的那样,将内存区域标记为不可缓存通常不是您想要的解决方案寻找。

关于c - 如何为某些内存区域禁用CPU缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426921/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com