【问题标题】:why is the cache-misses to instructions ratio a better indicator of cache performance compared to the cache-references to cache-misses ratio?为什么与缓存引用与缓存未命中比率相比,缓存未命中与指令比率是缓存性能的更好指标?
【发布时间】:2017-01-14 23:07:21
【问题描述】:

我正在使用 perf 来测试一种理论上证明是缓存友好算法的代码。

根据this article 的说法,指令的缓存未命中是缓存性能的一个很好的指标。

缓存未命中与指令的比率将指示如何 缓存正常工作;比率越低越好。在这个 例如,比率为 1.26%(6,605,955 缓存未命中/525,543,766 指示)。因为成本差异比较大 RAM 内存和缓存访问之间(100 个周期 vs

但是当我像这样运行 perf 时:

perf stat -B -e cache-references,cache-misses,instructions ./td 1.txt 2.txt

Perf 将打印以下内容:

Performance counter stats for './td 1.txt 2.txt':

    93,497,101      cache-references                                            
    56,452,246      cache-misses              #   60.379 % of all cache refs    
 8,115,626,200      instructions             

   2.509309040 seconds time elapsed

因此,它更多地关注缓存引用与缓存未命中的比率,而不是文章中建议的比率。

缓存未命中与缓存引用的比率似乎非常糟糕,为 60%,这意味着在我的应用程序访问缓存的 60% 的时间里,我遇到了缓存未命中。另一方面,缓存未命中与指令的比率仅为 0.6%。

我不知道该怎么办。我应该优化哪个比率?

【问题讨论】:

    标签: algorithm performance caching performance-testing


    【解决方案1】:

    它们最终都具有误导性,但方式不同。

    知道命中的未命中很有趣,但是您可以通过在处理未命中时执行大量算术来“吸收”一些未命中。 #instructions 未命中会告诉您一些相关信息,因为非常少的未命中/指令表明您处于这种情况。这并不意味着您实际上是这样,例如,如果下一个未命中的加载的地址是通过本身依赖于前一个未命中的长计算来计算的,那么这一切都会被序列化,并且未命中/指令变得有点误导。即便如此,如果它足够低,那么总时间主要取决于算术,因此未命中不会是一个大问题。

    不一定要优化它,因为你可以通过做无用的算术工作来作弊。或者,更合理地,做一个权衡,花费更多(有用的)算术来丢失一些未命中,这听起来不错,只是你可能会走得太远。显然,如果它开始花费更多的实际时间(或者通常它在你真正关心的任何事情上开始表现更差),那么你改进一些相当人为的指标并不重要(除非这真的是你关心的,你可能在综合基准测试中)。

    Misses/reference 显然可以告诉您一些有关您的访问模式的信息,但是执行大量缓存命中内存引用并不是代码好的指标:也许只是有很多不必要的内存引用。或者换一种说法,如果数据只需要一次,那么再次触摸它(即使不会产生丢失)仍然是一种浪费。这真的取决于问题。例如,如果您只是对一个数组求和,那么从这个指标的角度来看,将累加器放在内存中看起来非常好,但显然这是一件非常糟糕的事情。

    所以,

    我应该优化哪个比率?

    都不是,除非你想要纯合成的东西。使用它们来了解代码的执行方式,然后优化运行时间(或功率或其他任何东西,取决于您的目标)。这些“可疑的好”的模因和“坏”一样可能是一个线索,所以也许应该把它称为低和高。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多