【问题标题】:What is the price of a cache miss缓存未命中的代价是什么
【发布时间】:2012-08-30 09:33:57
【问题描述】:

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

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

我希望能够说“我的代码获得 90% 的 cpu 利用率”之类的话

是否可以根据缓存研磨输出来做到这一点?

【问题讨论】:

  • 根据documentation of cachegrind,“在现代机器上,L1 未命中通常会花费大约 10 个周期,LL 未命中可能会花费多达 200 个周期,并且错误预测的分支成本在该地区10 到 30 个周期。”
  • 您可以从系统规格中挖掘数字——如果你找到它们——或者使用像lmbench 这样的工具来测量它。然后您可以将它们插入cachegrind(或者它是我们用来可视化数据的kcachegrind 的一个功能?)。
  • @MatteoItalia:假设我有 1.000 次 L2 未命中,转换为 200.000 个未使用的周期。 2.0 GHz 芯片意味着 0.001 秒的等待?
  • @AProgrammer:我只是在读取valgrind --tool=cachegrind的输出
  • @Martin:CPU 行为过于复杂,无法如此简单地量化。如果不可用的数据被证明是不需要的,缓存未命中对性能的影响可能为零。

标签: c++ c memory-profiling cachegrind


【解决方案1】:

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

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

你可以在这里得到它:

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

【讨论】:

  • 看来在 Ubuntu 机器上使用 vtune 是不可能的 :-( 错误:无法开始分析,因为 ptrace 系统调用应用程序的范围有限。要启用分析,请设置 /proc /sys/kernel/yama/ptrace_scope 为 0。有关永久启用它的说明,请参阅文档。
  • sudo echo 1 > /proc/sys/kernel/yama/ptrace 应该可以解决这个问题。
  • 对不起,我的意思是零。啊,没有 root 访问权限会很困难。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我知道在不同的缓存级别上存在不同的速度问题,有趣的问题是,消除缓存未命中的可疑速度是多少?您将加速提高到 100 倍,这听起来很乐观
    • 是的,听起来确实有点乐观,但我猜如果 1GHz 时钟速度每秒执行 10 亿个时钟周期,您可以看到,如果您有多个缓存未命中,这会很快占用这些周期。至于计算加速的实际算法,我从未见过它提到它,因为它完全取决于硬件等。但是有一些应用程序可以为你做到这一点,比如上面提到的 Cachegrind。
    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多