我有一个使用复杂数据结构的软件,我想了解程序如何利用不同的缓存和寄存器。
问题:
我目前正在使用Visual Studio,因此首选插件,但该程序使用gcc进行编译。
编辑:像CodeAnalyst和CacheGrind这样的探查器似乎只在程序执行之后才会以探查器的方式执行此类操作,但我对理解逐步执行行为更感兴趣。
实施例
Code Line 1; // break here and show which variables are currently stored where.
Code Line 2;
for(int i=0; i<some_var; i++) {
Code Line 3; // break here and compare cache contents.
}
答案 0 :(得分:2)
我担心在运行期间你无法直接查看缓存状态,因为查看的行为,特别是涉及断点的行为,或者一些管理此检查的代码,会对缓存产生很大影响国家,实际上破坏了你想要检查的东西。更糟糕的是 - 假设你可以使用一些简单的代码获得某种缓存图片或转储 - 事实并非如此。
事实上,即使您在某个特定时刻神奇地获取了缓存状态的图片,但由于页面映射可能会不断变化,所以不会在几微秒后发生任何意义,因此会将线条取出并抛出一直缓存,整个缓存可以刷新。事实上,核心或CPU甚至可能会停止短暂的断电,在此过程中自动刷新缓存中的任何内容。
以下是以非侵入方式审核缓存上下文的3种方法:
使用可在任何给定时刻呈现该状态的模拟器。那里有各种缓存和CPU模拟器,我在这里提到了一些 - Implementing a cache modeling framework
缺点是这些都不能保证重新生成与真实CPU完全相同的场景。高速缓存模拟器是不现实的,因为它简化了对单个线性流的所有访问,忽略了例如真实CPU中由于分支错误预测而被刷新的那些。缺少计时元素也可能会改变替换策略的行为方式,并为您提供不同的结果。它不太可能是一个问题,它应该只对真正的角落情况产生影响,但请记住这一点。定时模拟器更加真实,并且有更好的机会重现您的问题,但是没有一个可用的模拟器必然会模拟CPU所具有的完全相同的微架构。您可以将它们配置为尽可能接近。
使用内部CPU性能计数器来跟踪缓存相关的统计信息。这为您提供了真实的图片,但不幸的是,它提供的可见性较低,绝对不是实时的。一些分析器(包括Vtune和它们之类的东西)可以为你做脏工作,并随着时间的推移呈现这些统计数据,这可能更有用。
添加要在检查缓存内容时以编程方式调用的专用代码。然后,此代码可以执行一些(有限的)检查,例如使用定时查找猜测缓存中是否存在某个行。这很复杂但如果你在那里寻找特定的线条可能更适合。我只是注意到我以一种非侵入性的方式写作 - 刮擦,这种方式当然非常具有干扰性。
答案 1 :(得分:0)
您还可以使用AMD的CodeAnalyst(免费)或英特尔的VTune(付费软件,但免费试用)。两者都是图形的,不像Valgrind