我可以检查内存块(例如,使用 malloc 分配)是否保留在缓存中吗?

Can i check if a chunk of memory (e.g., allocated using malloc) stays in the cache?

本文关键字:保留 是否 缓存 分配 malloc 内存 检查 例如 使用 我可以      更新时间:2023-10-16

假设我使用 malloc 分配了一些空间。我可以检查这个连续内存是否在运行时保留在 CPU 的缓存中(甚至更好的是缓存级别 L1、L2、L3 等)吗?

否,但您可以使用预取指令在使用前将其从内存移动到缓存。如果数据已经在缓存中,这些指令应该很快(有一些特定于体系结构的警告,但我不知道您使用的是哪个平台)。

您可以查询内存是否在缓存中的原因是,硬件在您可以轻松观察到的级别下管理内存。在具有硬件管理的 TLB 的架构上,内存将由任何地方的虚拟地址跟踪。

确定 CPU 缓存的内容是非常低级的,超出了 C 可以执行的操作。事实上,缓存对于您可能正在编写的代码是完全透明的,因为 CPU 几乎决定了要缓存的内容,并且不能浪费时间在如何执行此操作的复杂逻辑中。在谷歌上快速搜索了这方面的特定工具,得出了英特尔调优指南和性能分析论文:https://software.intel.com/en-us/articles/processor-specific-performance-analysis-papers。显然,这将是特定于供应商的。AMD可能会有特定的工具。

一般来说,至少对于大多数实际目的来说,没有(即使你可以,当你尝试使用这些信息时,它很可能已经过时了)。

如果您反复读取数据,您可以相当轻松地测量长期平均访问时间,这通常可以很好地指示数据的来源。

有一些(主要是嵌入式)处理器可以让您锁定缓存中的一些数据或将部分缓存留作您手动管理的可寻址内存。