首页 > 解决方案 > 如何记录每次内存访问的时间戳跟踪?

问题描述

有没有办法记录给定程序的每次内存访问,包括时间戳。可以perf用来做吗?

标签: linuxmemorycpu-architectureperf

解决方案


如果您使用的是英特尔,我认为其他答案中提到的英特尔 PT 功能与后处理和分析相结合最有可能以高速获得您想要的东西(即,性能上的一位数回归)。

如果您不关心性能,则可以使用任意数量的二进制检测框架来获取此信息。例如,valgrind框架有一个cachegrind工具,它可以捕获每个内存访问,并使用它们根据理想化的缓存模型来估计缓存行为。

您几乎可以修改 cachegrind 工具以吐出您所追求的访问列表以及时间戳。当然,问题在于 cachegrind 的运行速度可能比本机应用程序慢 10 倍,因此您的时间戳将被“拉伸”和扭曲(即,因为程序的各个部分可能具有不同的检测开销)。

这对您的应用程序是否重要取决于您。

Valgrind 的好处是它不依赖于任何特定的硬件并且可以跨不同的硬件架构工作。这可能也比让基于英特尔 PT 的分析工作更容易——尽管我不是 100% 确定,因为我自己尝试过。

如果您在录制时不关心实际进程的总运行时间,但需要大部分准确的时序数据,您还可以考虑在 CPU 模拟器下运行您的进程,例如Peter 在中提到的Sniper x86 模拟器gem5评论。

这个描述 CMP$im 工具的站点可能对您非常有用。它能够使用英特尔的PIN 技术生成访问痕迹,@Leeor 在下面的评论中也提到了这一点。我建议查看从该站点链接的作者的相关论文。


推荐阅读