【问题标题】:Cache Hit/Miss for a value in C/C++ Program缓存 C/C++ 程序中的值的命中/未命中
【发布时间】:2011-10-16 17:54:50
【问题描述】:

这是我的要求,我知道某些算法很好地利用了缓存,有些则没有,有些在特定数据集上比其他算法做更多的 I/O,等等。我希望自己看到和分析这种情况。

所以我想知道是否有一种方法可以知道如何读取某个内存/变量,即它是从缓存中读取的,还是缓存未命中。此外,如果在检索此值时出现页面错误等。

非常感谢!

【问题讨论】:

标签: c++ c performance profiling


【解决方案1】:

如果您真的想知道缓存何时命中/丢失,现代处理器具有性能计数器,您可以将其用于此目的。我已将它们广泛用于学术研究。使用它们的最简单方法是通过perfmon2。 Perfmon2 既有可以链接到程序的库,也有可以监控现有程序的独立程序。例如,下面是记录所有 1 级数据缓存读取请求和未命中的独立程序:

pfmon -eL1D_CACHE_LD:MESI,L1D_CACHE_LD:I_STATE your_program

作为参考,this document (PDF) 的附录 A 列出了英特尔关于可用硬件计数器的文档。

【讨论】:

    【解决方案2】:

    我会尝试使用valgrind cachegrind tool,它可以打印出带注释的源代码行,其中包含该行的缓存命中/未命中数。

    【讨论】:

    • 注意,cachegrind 缓存未命中并不是真正的缓存未命中,而是模拟的。
    【解决方案3】:

    我不知道 AMD CodeAnalyst 是否可以显示这种粒度级别,但检查一下也无妨。

    【讨论】:

    • AMD CodeAnalyst 在英特尔平台上有点受限(但最基本的也可以)。所以,对于英特尔来说,有英特尔 Vtune; linux oprofile/perf/perfmon2.
    【解决方案4】:

    取决于具体的编译器、操作系统和您运行的处理器的具体型号。 C/C++ 语言中的任何内容(据我所知)都无法让您访问缓存级别发生的事情。

    有各种测量工具,但它们在很大程度上独立于语言。

    有一些“规则”可以最大限度地减少缓存和分页问题,​​尽管我需要一些时间来考虑一个相当全面的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-29
      • 2012-04-21
      • 2012-04-22
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多