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

number of cache hits/miss vs page faults - C++ code - UBUNTU

本文关键字:-C++ 错误 -UBUNTU 代码 缓存      更新时间:2023-10-16

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

另一个问题是:我发现使用时间命令:我的代码的一部分给出了2133(小)页面错误,另一部分给出2361(小)页错误。(小)页面错误是否与缓存未命中有关?如果是,它是如何关联的。我必须执行一些I/O操作,这会导致(轻微)页面错误吗?

linux最全面的评测工具是oprofile,它可以评测单个应用程序或整个系统,并可以为您提供有关处理器上缓存未命中(以及它们发生的位置)的详细信息,这些处理器支持缓存未命中等事件的性能计数器(过去20年生产的几乎所有x86处理器都支持此类计数器)

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

写我自己的答案,因为对Chris Dodd的答案的评论越来越长。。。

您可以使用oprofile或perftool(它基本上使用与oprofile相同的内核功能)来提供缓存命中率和未命中率。请注意,很难说一个应用程序"应该有多少缓存未命中"或"缓存命中",而且你只能将这个数字与同一应用程序的另一次运行进行比较(经过调整,但也可以看到它在不同运行之间的差异有多大,这非常有用)。

我不认为页面错误的确切数量有那么关键——它往往会随着"运气"的不同而有所不同。

页面错误是由各种原因造成的。例如,分配一大块内存时,当页面第一次使用时,该内存将"不存在",此时,它将被标记为存在(并且可能在此时也被填充为零)。从共享库加载函数也会出现页面错误,因为在初始化共享库时这些函数"不存在"。在某些情况下,也可能是应用程序的一部分使用mmap在文件中进行映射,而不是使用文件读/写操作(这可能是您对文件I/O的想法)。