优化不同阵列的ARM缓存使用情况

use*_*999 6 arm cpu-cache

我想在ARM Cortex A8处理器上移植一小段代码.L1缓存和L2缓存都非常有限.我的程序中有3个数组.其中两个是按顺序访问的(大小>阵列A:6MB,阵列B:3MB),第三个阵列(大小>阵列C:3MB)的访问模式是不可预测的.虽然计算不是很严格,但是访问阵列C时存在巨大的缓存未命中.我认为一种解决方案是为阵列C分配更多的缓存(L2)空间,而对于阵列A和B则分配更少.但我不能找到任何方法来实现这一目标.我经历了ARM的预加载引擎但找不到任何有用的东西.

Nil*_*nck 2

分割缓存并将每个数组分配在其中的不同部分是一个好主意。

不幸的是这是不可能的。CortexA8 的缓存不够灵活。老式的 StrongArm 有一个二级缓存正是用于这种分割目的,但它不再可用了。我们有 L1 和 L2 缓存(总的来说,恕我直言,这是一个很好的改变。)

但是,您可以做一件事:

CortexA8 的 NEON SIMD 单元落后于通用处理单元大约 10 个处理器周期。通过巧妙的编程,您可以从通用单元发出缓存预取,但通过 NEON 进行访问。两个管道之间的延迟为缓存提供了一些时间来进行预取,因此平均缓存未命中时间会更低。

缺点是您绝对不能将计算结果从 NEON 移回 ARM 单元。由于 NEON 滞后,这将导致 CPU 管道完全刷新。缓存未命中的成本几乎甚至更高。

性能差异可能很大。出乎意料的是,我预计速度会提高 20% 到 30%。