我必须分析几个程序的内存访问。我正在寻找的是一个分析器,它让我可以看到我的哪个程序存在更多内存密集的计算密集型。我对L1数据高速缓存,L2和主存储器的访问次数非常感兴趣。
它必须适用于Linux,并且只能使用命令。编程语言是c ++。如果我的问题有任何问题,例如我不明白您的意思或我们需要更多数据,请在下面发表评论。
谢谢。
使用解决方案进行更新
我选择Crashworks的答案是有利的,因为它是唯一提供我所寻找的东西的人。但问题仍然存在,如果你知道更好的解决方案,请回答。
答案 0 :(得分:2)
无法确定对内存的所有访问,因为它没有多大意义。对内存的访问可能正在执行下一条指令(程序驻留在内存中),或者当程序读取或写入变量时,因此您的程序几乎始终访问内存 。
对你来说更有意思的可能是关注程序的内存使用情况(堆和堆栈)。在这种情况下,您可以使用标准的顶部命令。
您还可以监视系统调用(即写入磁盘或附加/分配共享内存段)。在这种情况下,您应该使用 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缓存处理的一些内容。
答案 1 :(得分:1)
也许cachegrind(valgrind套件的一部分)可能是合适的。
答案 2 :(得分:1)
如果您运行的是英特尔硬件,那么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 cache miss”计数器,以查看该函数内部发生了多少次未命中,当然您可以按层次结构进行操作。这可以通过例如发明一个类来简化,该类在输入范围内记录开始计时器并计算离开范围的增量。
VTune的仪表模式会在整个程序中自动为您完成此操作。等效的AMD工具是CodeAnalyst。 Valgrind声称是一个开源缓存分析器,但我自己从未使用它。
答案 3 :(得分:0)
您是否需要比unix命令top
更多的东西?这以易于阅读的演示格式提供了linux程序的cpu使用和内存使用。
如果你需要一些更具体的东西,也许是一个分析器,软件语言(java / c ++ /等)将有助于确定哪种分析器最适合你的情况。