【问题标题】:Profiling for analyzing the low level memory accesses of my program分析我的程序的低级内存访问的分析
【发布时间】:2009-01-06 16:52:30
【问题描述】:

我必须分析几个程序的内存访问。我正在寻找的是一个分析器,它允许我查看我的哪个程序是内存密集型而不是计算密集型。我对 L1 数据缓存、L2 和主存的访问次数非常感兴趣。

它需要适用于 Linux 并且仅通过命令使用才可能。编程语言是c++。如果我的问题有任何问题,例如我不明白您的意思或我们需要更多数据,请在下方评论。

谢谢。

更新解决方案

我选择了 Crashworks 的答案作为最喜欢的答案,因为它是唯一提供了我正在寻找的东西的答案。但是问题仍然悬而未决,如果您知道更好的解决方案,请回答。

【问题讨论】:

    标签: memory-management


    【解决方案1】:

    不可能确定对内存的所有访问,因为它没有多大意义。对内存的访问可能是执行下一条指令(程序驻留在内存中),或者当您的程序读取或写入变量时,因此您的程序几乎一直在访问内存

    您可能更感兴趣的是跟踪程序的内存使用情况(堆和堆栈)。在这种情况下,您可以使用标准的 top 命令。

    您还可以监视系统调用(即写入磁盘或附加/分配共享内存段)。在这种情况下,您应该使用 strace 命令。

    更完整的控制是通过 gdb 调试器来调试您的程序。它可以让您控制您的程序,例如为变量设置断点,以便在读取或写入程序时中断程序(也许这就是您要寻找的)。另一方面,GDB 可能很难学习,因此 DDD,它是一个 gtk 图形前端,可以帮助您开始使用它。

    更新:您正在寻找的是真正的低级内存访问,它在用户级别不可用(这是操作系统内核的任务)。我不确定甚至 L1 缓存管理是否由 CPU 透明处理并隐藏到内核。 很明显,您需要降低到内核级别,因此 KDB,解释为 here o KDBG,解释为 here

    更新 2:似乎 Linux 内核确实处理 CPU 缓存,但只处理 L1 缓存。 Understanding the Linux Virtual Memory Manager 这本书解释了 Linux 内核的内存管理是如何工作的。 This chapter 解释了 L1 缓存处理的一些内容。

    【讨论】:

      【解决方案2】:

      如果您运行的是 Intel 硬件,那么 VTune for Linux 可能是您可以使用的最好且功能最全的工具。

      否则,您可能不得不使用 perfctr 库直接读取性能计数器 MSR。我自己在 Linux 上没有这方面的经验,但我找到了几篇可能对您有所帮助的论文(假设您使用的是 x86——如果您正在运行 PPC,请回复,我可以提供更详细的答案): http://ieeexplore.ieee.org/Xplore/login.jsp?url=/iel5/11169/35961/01704008.pdf?temp=x http://www.cise.ufl.edu/~sb3/files/pmc.pdf

      一般而言,这些工具无法准确告诉您缓存未命中发生在哪些行上,因为它们通过轮询计数器来工作。您需要做的是在您感兴趣的每个函数的开头和结尾轮询“l1 缓存未命中”计数器,以查看该函数内部发生了多少未命中,当然您可以分层执行此操作。这可以通过例如发明一个类来简化,该类记录进入范围时的开始计时器并计算离开范围时的增量。

      VTune 的检测模式会在整个程序中自动为您执行此操作。等效的 AMD 工具是 CodeAnalyst。 Valgrind 声称是一个开源缓存分析器,但我自己从未使用过。

      【讨论】:

        【解决方案3】:

        也许cachegrind(valgrind 套件的一部分)可能是合适的。

        【讨论】:

          【解决方案4】:

          除了unix 命令top 提供的功能之外,您还需要什么吗?这以易于阅读的演示格式提供了 linux 程序的 cpu 使用率和内存使用率。

          如果您需要更具体的东西,也许是分析器,软件语言 (java/c++/etc.) 将帮助确定哪种分析器最适合您的情况。

          【讨论】:

            猜你喜欢
            • 2012-11-26
            • 2016-02-10
            • 1970-01-01
            • 2014-10-27
            • 1970-01-01
            • 2013-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多