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