我正在分析一些代码并使用cachegrind来获取执行中的cachemisses(L2和L3)的数量。
我的问题是如何根据缓存未命中确定等待缓存获取预留的时间?
我希望能够说出“我的代码获得90%的cpu利用率”
是否可以根据缓存研磨输出执行此操作?
答案 0 :(得分:2)
Cachegrind简单地模拟CPU上的执行,模拟缓存和分支预测器的行为方式。为了能够知道在缓存上花费多长时间,需要更多信息。具体而言,您需要知道何时可以推测执行以及可以并行分派多少指令(以及如何同时协调内存访问)。 Cachegrind无法做到这一点,任何可能在很大程度上依赖于处理器的工具(而缓存未命中的处理器依赖性要小得多)。
如果您可以使用现代的英特尔CPU,我建议您免费获得一份VTune(用于非商业用途)并查看其内容。它可以告诉处理器收集有关缓存未命中的数据并将其报告给您,这样您就可以看到实际发生的事情,而不仅仅是模拟。它将为每行代码提供每个指令的时钟,使用它可以看到哪些行在缓存上阻塞(以及多长时间),它还可以为您提供cachegrind可以提供的所有其他信息。
你可以在这里得到它:
http://software.intel.com/en-us/articles/non-commercial-software-download/
答案 1 :(得分:1)
唯一可以确定的方法是使用CPU的性能监视计数器来测量特定的CPU - 即使这样,结果也非常具体,基于此的任何优化都可能对具有不同高速缓存大小的CPU执行得非常糟糕,总线架构或内存配置。
答案 2 :(得分:1)
可以在几个时钟周期内从缓存中获取变量。
如果它不在缓存中,则可能需要一百多个时钟周期才能从RAM中获取它。