【问题标题】:Programmatically counting cache faults以编程方式计算缓存故障
【发布时间】:2011-07-23 19:18:54
【问题描述】:

我需要在一堆关于内存层次效率的假设中评估 C++ 函数所花费的时间(例如:当我们有缓存未命中、缓存命中或读取数组的一部分时发生页面错误时所花费的时间),所以我希望有一些库可以让我计算缓存未命中/页面错误,以便能够自动生成性能摘要。

我知道有一些工具,比如 cachegrind,可以提供给定应用程序执行的一些相关统计信息,但我想要一个库,正如我已经说过的那样。

编辑哦,我忘了:我使用的是 Linux,我对可移植性不感兴趣,这是一个学术问题。

欢迎提出任何建议!

【问题讨论】:

  • 您能否检测操作系统以帮助您提供一些此类信息?在具有虚拟内存的现代抢占式多任务系统中,操作系统很可能会在不知情的情况下对您的应用程序执行各种疯狂的操作...
  • 我不知道,我使用的是 Linux。至于页面错误,我知道由于现代操作系统管理内存的方式,此类统计信息并不重要,正如您所说:事实上,我对 L2 缓存未命中更感兴趣,我认为它更独立于操作系统管理。

标签: c++ linux memory-management


【解决方案1】:

现在看起来正是我要搜索的内容:perf_event_open

它可以让您做一些有趣的事情,例如初始化/启用/禁用一些性能计数器,以便随后通过统一且直观的 API 获取它们的值(它为您提供了一个特殊的文件描述符,其中包含一个包含先前请求的信息的结构)。

这是一个仅限 linux 的解决方案,功能因内核版本而异,所以要小心 :)

【讨论】:

    【解决方案2】:

    Intel VTune 是一款性能调优工具,可以完全满足您的要求; 当然,它适用于英特尔处理器,因为它访问内部处理器计数器,正如Jerry Coffin 所解释的那样,因此这可能不适用于 AMD 处理器。 它暴露了数以百计的计数器,如缓存命中/未命中、分支预测率等。它的真正问题是了解要检查哪些计数器;)

    【讨论】:

    • 有趣的工具,但我正在阅读文档,找不到任何关于在运行时获取一些性能统计信息的 API。
    • 老实说,我一直将其用作独立程序,如果我发现更多详细信息,我会发布它们;)
    • 这就是我发现的:linklink
    • @akappa:请忽略之前的评论:这就是我发现的:vtune API for pause/resumeVTune API for reader/writer 不确定这是否正是您要寻找的。​​span>
    【解决方案3】:

    缓存未命中不能简单地计算。大多数工具或分析器通过将内存访问重定向到提供此功能的函数来模拟内存访问。这意味着这类工具会在所有完成内存访问的地方检测代码,并使您的代码运行得非常缓慢。我猜这不是你的意图。

    但是,根据硬件的不同,您可能还有其他一些可能性。但即使是这种情况,操作系统也应该支持它(因为否则您将获得系统全局统计信息,而不是与进程或线程相关的统计信息)

    编辑:我可以找到这篇可能对您有所帮助的有趣文章:http://lwn.net/Articles/417979/

    【讨论】:

    • 我正在考虑一些“神奇”的处理器特性(比如一些很好的寄存器,它们以某种方式计算缓存错误),由一个库抽象出来,该库自动检​​测处理器类型并进行必要的管道以获得实际数据。我不知道这样的东西是否可行——例如,应该在上下文切换时复制那些“魔法值”——但如果存在这样的库会很棒。
    【解决方案4】:

    最新的 CPU(AMD 和 Intel)都有可用于此类工作的性能监视器寄存器。对于 Intel,它们在程序员参考手册第 3B 卷第 30 章中进行了介绍。对于 AMD,它在 BIOS 和内核开发人员指南中。

    无论哪种方式,您都可以计算缓存命中、缓存未命中、内存请求、数据预取等内容。它们具有非常特定的选择器,因此您可以计算(例如)二级缓存上的读取次数填充 L1 指令缓存中的行(同时仍然不包括 L2 读取以填充 L1 数据缓存中的行)。

    有一个 Linux 内核模块可以访问 MSR(特定于模型的寄存器)。顺便说一句,我不知道它是否可以访问性能监视器寄存器,但我希望它可能会。

    【讨论】:

    • 你说的内核模块是指perfmon2吗?
    • @akappa:我记得,它只是被称为“MSR 内核模块”或类似的东西。不过我已经有一段时间没有使用它了,所以我可能记错了它的名字。
    • 好的,如果 perfmon2 太难使用,我会做一些研究。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多