【问题标题】:How to measure Cache or TLB misses on ARM Cortex-A15如何测量 ARM Cortex-A15 上的 Cache 或 TLB 未命中
【发布时间】:2015-12-11 16:01:53
【问题描述】:

我很晚才在 ARM Cortex-A15 上分析我的应用程序,并观察到一个函数中有更多缓存未命中,该函数从全局缓冲区中获取三个参数。该函数是单 IIR 滤波器,它在开始时访问状态并在结束时更新状态。如果我这样使用状态,它会折腾并给出巨大的缓存未命中。如果我将状态值复制到该函数的本地缓冲区并在整个函数中使用状态的本地副本,则会减少缓存未命中。状态的大小几乎不是 10 个 int 类型的值。您能否通过一些见解来了解缓存前端发生了什么?如何避免这种情况?

【问题讨论】:

    标签: caching statistics arm tlb


    【解决方案1】:

    您提供的少量信息很难确定,但我强烈怀疑缓存污染是您的解释。如果您遍历一堆缓冲区,您会将它们塞入缓存中,并且可能会弄脏它们。随着您的进行,缓存有效地被旧缓冲区数据填充,这些数据在您完成后很长时间由 CPU 的缓存尽职尽责地维护(不幸的是,在您的情况下)。

    如果将状态值复制到本地缓冲区中,则只修改数据的一份副本,而不是在所有这些全局缓冲区地址的整个内存中就地修改数据。您仍在使用您吹过的缓冲区中的数据填充缓存,但这些不是“脏”缓存行 - 即未修改。由于本地缓冲区总是一遍又一遍地覆盖相同的地址,因此您只会为修改状态弄脏少量(少数)缓存行。当需要重用脏缓存行时,必须将它们写回内存。但是,当需要重用它们的缓存行时,可以简单地覆盖干净的只读缓存行(例如全局缓冲区)。这是一笔可观的节省。

    您不清楚您修改后的状态是否实际存储在缓冲区中。如果您真的需要这方面的帮助,这将有助于显示序列和一些代码或伪代码以显示正在发生的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2015-08-12
      • 2011-04-12
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      相关资源
      最近更新 更多