我一直想知道如何控制缓存在内存中的内容。
我一直认为至少无法使用c ++。
直到有一天,有人告诉我不要在c ++应用程序中包含lua脚本,因为它“......因完全破坏你的缓存而臭名昭着......”。
这让我思考,无论如何用c ++或任何其他编译语言来控制程序在内存中缓存的内容。因为如果lua可以修改我的缓存性能,那么为什么我不能。
如果是的话,
我。它是依赖于体系结构还是依赖于操作系统?
II。您可以访问缓存中的内容或缓存的内容吗?
为了清楚我正在谈论CPU缓存。
答案 0 :(得分:3)
CPU将缓存它所需的所有数据,并且因为当它必须加载新内容时它的大小是有限的,它将丢弃最近最少使用的任何数据。
基本上你没有直接控制它,但间接你有一些:
您必须知道的是CPU使用缓存行。每个缓存行都是一小块内存。
因此,如果CPU需要一些数据,它将获取整个块。所以,如果你有一些非常频繁使用的数据并且通常会分散在内存中,你可以把它放在一个结构中,这样CPU缓存的有效使用会更好(你可以缓存更少的东西)需要)。注意:99.99%的时间您不需要这些优化。
更有用的示例是遍历不适合缓存的二维数组。如果你线性地走它,你将加载每个缓存行一次,处理它,稍后CPU将丢弃它。如果使用索引的方式错误,每个缓存行将被多次加载,并且由于主内存访问速度很慢,因此代码将 lot 更慢。如果你走线性(方向无关紧要),CPU也可以做更好的预取。
缓存性能也可能通过调用一些需要大量数据和/或代码的外部库来破坏,因此主程序+数据将从缓存中删除,当调用完成时,CPU必须再次加载它。 / p>
如果您执行重优化并想知道如何使用L1 / L2 / ..缓存,则可以进行模拟。 Valgrind有一个名为Cachegrind的优秀模块,它就是这样做的。
答案 1 :(得分:1)
CPU cache通常用于多个独立缓存。在大多数现代CPU中,通常有三个缓存:
正如yi_H所说:你没有直接控制它,但你确实有间接控制。
因此缓存性能较差的原因有很多。 常见的是:
这通常导致thrashing,其中CPU主要处于等待数据处理的理想状态。
如果要影响CPU缓存性能,则需要将应用程序中每个关键性能区域的指令和数据工作集尽可能地减小,而不管应用程序编写的OS /语言是什么。
关于你的问题:
我。它是依赖于体系结构还是依赖于操作系统?
是
II。您可以访问缓存中的内容或缓存的内容吗?
没有
答案 2 :(得分:0)
在大多数平台上,不,你不能直接控制缓存的内容。通常,每当您从某个内存地址读取时,该内存的内容将被复制到缓存中,除非您需要的内容已经在缓存中。
当他们谈论“破坏你的缓存”时,他们真正的意思是“破坏你的表现”。读取片外存储器很慢(高延迟);读缓存很快(低延迟)。如果以愚蠢的模式访问内存,您将不断覆盖缓存的内容(即“缓存未命中”),而不是重新使用缓存中已有的内容(即“缓存命中”)并最大限度地减少从片外内存中读取的内容