了解C程序的缓存行为

3

在运行C程序时,有没有办法知道缓存命中率或缓存内存的一些行为?

我正在尝试比较函数的两个不同实现,以了解缓存的行为。


如果您有一个正确工作的程序代码,可以在代码审查中提出问题。根据所述,此问题对于SO来说是OT。 - too honest for this site
3
请注意,支持此功能的工具是特定于平台和/或编译器的。在Windows上的答案与Linux上的答案不同,而AIX、Mac OS X、HP-UX、Solaris等系统的答案又各不相同。 - Jonathan Leffler
你为什么在意呢?更重要的是你的程序整体性能,或者其中一个显著大的函数的表现。缓存是平台(实际上是处理器)的一部分。 - Basile Starynkevitch
@BasileStarynkevitch 我正在为大学做一些研究,这是我正在处理的其中之一。 - Manuel Mena
1个回答

5

是的,有一些工具可以做到这一点,但正如人们所期望的那样,它们是特定于平台/架构的。它们也可能有编译器限制:

  1. Cachegrind:缓存和分支预测分析器。这可能是最接近您所寻找的内容。您可以通过 valgrind(假设使用Linux内核)来使用它。

    valgrind --tool=cachegrind your_program

它有一些更多的微调选项。请查看文档。在 Cachegrind 中的典型转储/输出如下(从网站中剥离)

==31751== I   refs:      27,742,716
==31751== I1  misses:           276
==31751== LLi misses:           275
==31751== I1  miss rate:        0.0%
==31751== LLi miss rate:        0.0%
==31751== 
==31751== D   refs:      15,430,290  (10,955,517 rd + 4,474,773 wr)
==31751== D1  misses:        41,185  (    21,905 rd +    19,280 wr)
==31751== LLd misses:        23,085  (     3,987 rd +    19,098 wr)
==31751== D1  miss rate:        0.2% (       0.1%   +       0.4%)
==31751== LLd miss rate:        0.1% (       0.0%   +       0.4%)
==31751== 
==31751== LL misses:         23,360  (     4,262 rd +    19,098 wr)
==31751== LL miss rate:         0.0% (       0.0%   +       0.4%)

对于Windows,还有WinCachegrind

  1. gem5:用于计算机系统架构研究的模块化平台。适用于ARMX86AlphaSPARC,也支持一些特定的GPU型号。不确定是否支持非POSIX平台。
  2. CACTI:用于统一和非统一缓存体系结构的集成缓存访问时间、周期时间、面积、漏电和动态功率模型。
  3. MARSSx86:用于基于x86系统的微体系结构和系统模拟器。

非常感谢@romeric! - Manuel Mena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接