高速缓存命中/未命中数与页面错误数 - C ++代码 - UBUNTU

时间:2013-08-11 16:30:40

标签: c++ linux performance caching ubuntu

我想知道我的C ++代码有多高效缓存。我在UBUNTU上运行它。如何查找缓存命中数或缓存未命中?

另一个问题是:我发现使用time command:我的代码的一部分给出了2133(次要)页面错误,另一部分给出了2361(次要)页面错误。 (次要)页面错误是否与缓存未命中有关?如果是这样,它是如何相关的。我必须执行一些I / O是否会导致(次要)页面错误?

2 个答案:

答案 0 :(得分:2)

最全面的Linux分析工具是oprofile,它可以分析单个应用程序或整个系统,并且可以为支持性能计数器的处理器提供有关缓存未命中(以及它们发生的位置)的详细信息。高速缓存未命中等事件(过去20年来几乎所有的x86处理器都支持这样的计数器)

页面错误与缓存未命中无关,但它们也是性能问题的潜在来源。

答案 1 :(得分:1)

写出我自己的答案,因为它比克里斯多德的回答要长得多......

您可以使用oprofile或perftool(基本上使用与oprofile相同的内核功能)将为您提供缓存命中与未命中。请注意,很难说应用程序“应该有多少缓存未命中”或“缓存命中”,并且您实际上只能将该数字与同一应用程序的另一次运行进行比较(在调整之后,但也看到了多少)它从一个运行到另一个运行是非常有用的)。

我认为页面错误的确切数量并不重要 - 根据“运气”,它往往会有所不同。

页面错误是由各种各样的事情引起的。例如,分配大块内存,当页面第一次被使用时,该内存将“不存在”,并且在那时,它将被标记为存在(并且可能在该点处也填充为零)。您还会从共享库中加载函数时遇到页面错误,因为在初始化共享库时它们“不存在”。在某些情况下,也可能是应用程序的一部分使用mmap映射到文件中,而不是使用文件读/写操作(这可能是您对文件I /的想法) O)。