6

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

4

2 回答 2

2

拆分缓存并将每个数组分配到它的不同部分是一个好主意。

不幸的是,这是不可能的。CortexA8 的缓存没有那么灵活。旧的 StrongArm 有一个二级缓存来实现这种拆分目的,但它不再可用。我们改为使用 L1 和 L2 缓存(总体而言,恕我直言,这是一个很好的改变。)

但是,您可以做一件事:

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

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

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

于 2010-03-04T21:11:08.533 回答
0

从我通过 Google 可以找到的信息来看,ARMv7(这是 Cortex A8 支持的 ISA 版本)似乎具有缓存刷新功能,尽管我找不到关于如何使用它的明确参考——也许你可以如果你花更多的时间在上面,比我在搜索框中输入“ARM 缓存刷新”并阅读结果的一两分钟做得更好。

无论如何,您应该能够通过定期发出“flush”指令来清除您知道不再需要的 A 和 B 部分,从而达到您想要的近似值。

于 2010-03-05T02:07:22.177 回答