我很晚才开始在ARM Cortex-A15上使用我的应用程序,并在一个函数中观察到更多缓存未命中,这个函数从全局缓冲区中获取三个参数。该函数是sinple IIR滤波器,它在开始时访问状态并在结束时更新状态。如果我使用状态,它会折腾并给出巨大的缓存未命中。如果我将状态值复制到本地缓冲区到该函数并在整个函数中使用状态的本地副本,则会减少缓存未命中。状态的大小几乎不是int类型的10个值。你可以通过缓存前端发生的一些见解吗?如何避免这种情绪?
答案 0 :(得分:0)
从您提供的少量信息中肯定知道这很难,但我强烈怀疑缓存污染是您的解释。如果你浏览了一堆缓冲区,你就会将它们填入缓存中,并可能弄脏它们。随着时间的推移,缓存有效地由旧的缓冲区数据填充,这些缓冲区数据在您完成之后很久就会被CPU的缓存尽职尽责(不幸的是,在您的情况下)。
如果将状态值复制到本地缓冲区中,则只修改数据的一个副本,而不是在所有这些全局缓冲区地址的整个内存中进行修改。你仍然用你吹过的缓冲区中的数据填充缓存,但这些不是“脏”缓存行 - 即没有修改。由于本地缓冲区总是一遍又一遍地覆盖相同的地址,因此只会为修改后的状态弄脏少量(几个)缓存行。当需要重用时,必须将脏缓存行写回内存。但是,当需要重用高速缓存行时,可以简单地覆盖干净的,只读的高速缓存行(例如全局缓冲区)。这是一笔可观的节省。
您不清楚您的修改后的状态是否实际存储在缓冲区中。如果你真的需要帮助,那么显示序列和一些代码或伪代码将有助于显示正在发生的事情。