是否可以检查变量是否位于 L1/L2/L3 缓存中

Posted

技术标签:

【中文标题】是否可以检查变量是否位于 L1/L2/L3 缓存中【英文标题】:Is it possible to check if a variable is located at L1/L2/L3 cache 【发布时间】:2019-12-03 13:58:20 【问题描述】:

众所周知,在现代计算机架构中,有L1/L2/L3缓存,可以提高程序的执行性能。

我的问题是我们是否可以知道变量在执行时是否加载到 L1/L2/L3 缓存中?

我们知道我们可以像这样在 C++ 中打印变量的地址:int i; cout << &i;。那么如果i被加载到L1缓存中,&i显示的是哪种地址呢? L1缓存的地址还是RAM的地址?

【问题讨论】:

它将在堆栈上显示i的地址,因此RAM。我很确定在执行时检查缓存中是否有东西更有可能减慢代码速度^^。 你不知道,至少在可移植的 C++ 中,因为对象的地址永远不会改变。而不是担心它,你应该做的是确保你的变量是“热的”,所以它们更有可能在缓存中。 您可以使用硬件性能计数器,例如通过 PAPI 库,检查访问某个内存位置时是否发生缓存命中或未命中。 您必须查看处理器的数据表,也许还需要查看您的平台。在许多系统中,L1 和 L2 缓存在处理器之外是不可访问的。 @Lundin:我是说您正在向 OP 的问题添加一些不存在的内容。从根本上说,OP 想知道如何获取缓存中变量的地址。可能会添加 profiling 标签,因为 OP 想知道访问缓存的效率。我们不知道 OP 提问的目的。您不能假设 OP 正在写入屏幕或图形内存。 【参考方案1】:

在典型的 PC 中,&i 始终是 RAM 位置的地址。这是因为缓存对程序员来说本质上是透明的。它只是将包含在内存区域中的相同信息的副本存储在 CPU 可以更快访问的位置。它不能直接作为内存位置寻址。

至于代码执行时变量是否“定位”在缓存中,这是肯定的。当您尝试访问内存位置中的数据时,如果该数据尚未在缓存中,则会在处理您的请求之前先将其带入缓存。

【讨论】:

以上是关于是否可以检查变量是否位于 L1/L2/L3 缓存中的主要内容,如果未能解决你的问题,请参考以下文章

如何在现代 x86/amd64 芯片上关闭 L1、L2、L3 CPU 缓存?

为什么CPU缓存会分为一级缓存L1L2L3?有什么意义?

为什么CPU缓存会分为一级缓存L1L2L3?有什么意义?

学习总结cpu缓存

分布式-技术专区-缓存系统问题分析

从多个视图进行 3D 重建