Caching 关于缓存的问题

Caching 关于缓存的问题,caching,language-agnostic,programming-languages,Caching,Language Agnostic,Programming Languages,我一直想知道如何控制缓存到内存中的内容 我一直认为不可能和C++做任何事情。 直到有一天当一个人告诉我不要在C++应用程序中包含Lua脚本时,因为它……因为完全毁坏了你的缓存而臭名昭著…… 这让我思考,不管是C++还是其他编译语言,都控制着程序在内存中的缓存。因为如果Lua可以修改我的缓存性能,那么为什么我不能。 如果是, 一,。它是依赖于体系结构还是依赖于操作系统 二,。您可以访问缓存中的内容或缓存的内容吗 我要说的是CPU缓存。在大多数平台上,不能直接控制缓存的内容。通常,每当您读取某个内存

我一直想知道如何控制缓存到内存中的内容

<>我一直认为不可能和C++做任何事情。

直到有一天当一个人告诉我不要在C++应用程序中包含Lua脚本时,因为它……因为完全毁坏了你的缓存而臭名昭著……

这让我思考,不管是C++还是其他编译语言,都控制着程序在内存中的缓存。因为如果Lua可以修改我的缓存性能,那么为什么我不能。 如果是,

一,。它是依赖于体系结构还是依赖于操作系统

二,。您可以访问缓存中的内容或缓存的内容吗


我要说的是CPU缓存。

在大多数平台上,不能直接控制缓存的内容。通常,每当您读取某个内存地址时,该内存的内容都会被复制到缓存中,除非您需要的内容已经在缓存中


当他们谈论“破坏缓存”时,他们真正的意思是“破坏性能”。读取片外存储器速度慢(高延迟);读取缓存速度快(低延迟)。如果你以愚蠢的模式访问内存,你将不断覆盖缓存的内容(即“缓存未命中”),而不是重复使用缓存中已有的内容(即“缓存命中”),并尽量减少片外内存的读取。

在大多数平台上,不,你无法直接控制缓存的内容。通常,每当您读取某个内存地址时,该内存的内容都会被复制到缓存中,除非您需要的内容已经在缓存中


当他们谈论“破坏缓存”时,他们真正的意思是“破坏性能”。读取片外存储器速度慢(高延迟);读取缓存速度快(低延迟)。如果您以愚蠢的模式访问内存,您将不断覆盖缓存的内容(即“缓存未命中”),而不是重复使用缓存中已有的内容(即“缓存命中”)并最大限度地减少片外存储器的读取。

CPU将缓存它所需的所有数据,因为当它必须加载新的数据时,它的大小是有限的,所以它将删除最近使用最少的数据

基本上你不能直接控制它,但间接地你有一些:

您必须知道的是,CPU使用缓存线。每个缓存线都是一小块内存

因此,如果CPU需要一些数据,它将获取整个块。因此,如果您有一些经常使用且通常分散在内存中的数据,您可以将其放入结构中,这样CPU缓存的有效利用率就会更好(您缓存的不需要的数据会更少)。注意:99.99%的时间你不需要这些优化

一个更有用的示例是遍历不适合缓存的二维数组。如果以线性方式运行,则会加载每个缓存线一次,然后对其进行处理,稍后CPU会将其丢弃。如果您使用索引的方式错误,每个缓存线将被多次加载,并且由于主内存访问速度较慢,您的代码将慢得多。若你们沿着直线行走,CPU也能做得更好(方向无关紧要)

调用需要大量数据和/或代码的外部库也会破坏缓存性能,因此主程序+数据将从缓存中删除,当调用完成时,CPU必须再次加载


如果您进行了大量优化,并且想知道如何利用L1/L2/。。缓存你可以做模拟。Valgrind有一个很好的模块,名为,它可以做到这一点。

CPU将缓存它所需要的所有数据,因为它的大小是有限的,当它必须加载新的内容时,它将删除最近使用最少的任何内容

基本上你不能直接控制它,但间接地你有一些:

您必须知道的是,CPU使用缓存线。每个缓存线都是一小块内存

因此,如果CPU需要一些数据,它将获取整个块。因此,如果您有一些经常使用且通常分散在内存中的数据,您可以将其放入结构中,这样CPU缓存的有效利用率就会更好(您缓存的不需要的数据会更少)。注意:99.99%的时间你不需要这些优化

一个更有用的示例是遍历不适合缓存的二维数组。如果以线性方式运行,则会加载每个缓存线一次,然后对其进行处理,稍后CPU会将其丢弃。如果您使用索引的方式错误,每个缓存线将被多次加载,并且由于主内存访问速度较慢,您的代码将慢得多。若你们沿着直线行走,CPU也能做得更好(方向无关紧要)

调用需要大量数据和/或代码的外部库也会破坏缓存性能,因此主程序+数据将从缓存中删除,当调用完成时,CPU必须再次加载

如果您进行了大量优化,并且想知道如何利用L1/L2/。。缓存你可以做模拟。Valgrind有一个很好的模块,名为,它正好做到这一点。

通常用于多个独立的缓存。在大多数现代CPU上,通常有三个缓存:

  • 指令缓存
  • 数据缓存
  • 转换查找缓冲区(TLB)
正如Yiu H所说:你不能直接控制它,但你可以间接控制它

因此,缓存性能差有多种原因。 常见的有:

  • 指令太大,无法装入指令缓存
  • 数据太大,无法放入数据缓存
  • 综合上述因素
这通常会导致CPU主要坐在那里等待数据处理

如果你想影响你的CPU缓存性能,你需要减少你的指令和数据