4

我正在分析一些代码并使用 cachegrind 来获取执行中的缓存未命中数(L2 和 L3)。

我的问题是如何根据缓存未命中来确定等待缓存准备就绪所花费的时间?

我想说“我的代码得到 90% 的 cpu 利用率”之类的话

是否可以根据缓存研磨输出来执行此操作?

4

3 回答 3

2

Cachegrind 只是模拟 CPU 上的执行,模拟缓存和分支预测器的行为方式。要知道您将在缓存上花费多长时间阻塞将需要更多信息。具体来说,您需要知道何时可以推测执行以及可以并行调度多少条指令(以及如何同时协调内存访问)。Cachegrind 无法做到这一点,任何可能严重依赖处理器的工具(而缓存未命中对处理器的依赖性要小得多)。

如果您可以使用现代 Intel CPU,我建议您获取一份免费的 VTune(用于非商业目的)并查看它的内容。它可以告诉处理器收集有关缓存未命中的数据并将其报告给您,因此您可以查看实际发生的情况,而不仅仅是模拟。它将为每行代码的每条指令提供一个时钟,使用它您可以查看哪些行在缓存中阻塞(以及多长时间),它还可以为您提供 cachegrind 可以提供的所有其他信息。

你可以在这里得到它:

http://software.intel.com/en-us/articles/non-commercial-software-download/

于 2012-08-30T09:46:58.660 回答
1

唯一可以确定的方法是使用 CPU 的性能监控计数器来测量您的特定 CPU - 即使这样,结果也是非常具体的,您基于此所做的任何优化都可能在具有不同缓存大小、总线架构的 CPU 上执行得非常糟糕或内存配置。

于 2012-08-30T09:55:02.360 回答
1

一个变量可以在几个时钟周期内从缓存中取出。

如果它不在缓存中,它可能需要超过一百个时钟周期才能从 RAM 中获取。

于 2013-06-12T07:10:27.550 回答