【问题标题】:Memory in cache in CC中缓存中的内存
【发布时间】:2017-10-23 09:54:05
【问题描述】:

有没有办法查明我请求的内存是否被缓存?如果是这样,了解该内存块存储在哪一级缓存中会很有帮助。

我有一个想法,指针的地址在缓存时可能会改变,但看起来这不起作用。

编辑:这是针对大学项目的,我可以访问具有不同操作系统的多台机器,因此几乎任何解决方案都会有所帮助。

【问题讨论】:

  • 这在很大程度上取决于您使用的硬件和软件。请edit您的问题。
  • 你在说什么级别的缓存?您不会找到任何尚未缓存在硬件中的现代 CPU,而且您真的不应该关心。这可能是XY problem
  • 实际上想解决什么问题:阅读:XY Problem
  • 如果你想研究缓存的使用,我可以推荐cachegrind(一个valgrind子系统)或“perf”,两者都可以在linux上使用
  • 询问缓存中是否有某些东西是没有意义的,因为在您可以对它做任何事情之前,答案已经过时了。有些事情超出了您的控制范围,可能会更改缓存的状态,包括您运行以查找缓存中是否存在某些内容的代码。

标签: c caching


【解决方案1】:

我有一个想法,指针的地址在缓存时可能会改变,但是 好像不行。

您可能误解了缓存的工作原理。缓存是一个单独的内存,是的,它有自己的地址,但是当 CPU 从 RAM 中缓存内存行时,它会记录内存所在的 RAM 地址,并在 RAM 地址和缓存之间保持映射地址。从您的程序的角度来看,地址是相同的。如果您的程序需要一个地址,并且 CPU 在映射中看到该地址(缓存命中,成功),CPU 会即时转换地址并从缓存而不是 RAM 获取数据。

有什么方法可以查明我请求的内存是否被缓存或 不是吗?

从高级语言(如 C),没有。操作系统理论上可以(取决于 CPU 架构)找出地址是否被缓存,但这不是 C 语言可以依赖的。

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

【讨论】:

  • 指针是虚拟地址,所以我知道它可能不会改变,但这只是我想到的。但是谢谢你的链接,看起来我可以通过测量访问时间来做我需要做的事情。
  • 如果你问的是“我该怎么做”,那么就不要问“有没有办法”。有方法,定时内存访问和类似的方法。然而,在进行此类非常详细的计时时存在一些缺陷。
  • 值得注意的是,C 没有提供任何标准 方法来执行此操作。然而,这并不能阻止操作系统有一些系统调用或类似的平台相关的东西可以给你这些数据——甚至可能通过使用嵌入式程序集。问题是没有独立于平台的方法来做到这一点。如果你愿意,你需要弄清楚你的 CPU 是否允许,如果允许,它是如何工作的,然后使用这些信息来构建一个依赖于平台的方式。
【解决方案2】:

如果您已经请求了任何内存块,肯定会被缓存。

当请求任何内存地址时,会检查第一级缓存,如果失败,则检查第二级,依此类推。

一旦找到该地址所属的块,由于principle of locality,整个块被放置在第一级缓存中,以避免对同一块的额外搜索(例如,如果您访问相同的块)地址或连续的),这在几乎每个程序中都很常见(for循环,索引等)

【讨论】:

  • 这取决于缓存策略 (en.wikipedia.org/wiki/Cache_replacement_policies) 和可选的无缓存页面等。
  • @dbrank0 是的,但是替换策略会确定将删除哪个已缓存的块以替换新的块。每当您尝试访问内存块时,它将被复制到缓存内存中。如果不这样做,或者有选择地这样做,内存层次结构将无法按预期工作
  • 是的,我打字的速度比想象的要快。可能没有实用的缓存算法不会在未命中时将数据读入缓存(除非没有缓存页面)。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
相关资源
最近更新 更多