我想在ARM Cortex A8处理器上移植一小段代码。 L1缓存和L2缓存都非常有限。我的程序中有3个数组。其中两个被顺序访问(大小>阵列A:6MB和阵列B:3MB)并且第三阵列的访问模式(大小>阵列C:3MB)是不可预测的。虽然计算不是非常严格,但是访问阵列C存在巨大的缓存未命中。我认为一种解决方案是为阵列C分配更多缓存(L2)空间,而对于阵列A和分配更少。 B.但我无法找到任何方法来实现这一目标。我经历了ARM的预加载引擎但找不到任何有用的东西。
答案 0 :(得分:1)
分割缓存并将每个数组分配到其中的不同部分是个好主意。
不幸的是,这是不可能的。 CortexA8的缓存并不灵活。好老的StrongArm有一个二级缓存,正是为了这个分裂的目的,但它不再可用了。我们有L1和L2缓存(总体上是一个很好的改变imho。)
但是,有一件事你可以做:
CortexA8的NEON SIMD单元落后于通用处理单元大约10个处理器周期。通过巧妙的编程,您可以从通用单元发出缓存预取,但可以通过NEON进行访问。两个流水线之间的延迟为缓存提供了一些时间来进行预取,因此平均缓存未命中时间会更短。
缺点是如果必须永远不要将计算结果从NEON移回ARM单元。由于NEON滞后,这将导致完整的CPU管道刷新。差不多甚至更高,因为缓存未命中。
性能差异可能很大。出乎意料的是,我预计会有20%到30%的速度提升。
答案 1 :(得分:0)
从我通过Google找到的内容看起来像ARMv7(这是Cortex A8支持的ISA版本)具有缓存清除功能,但我找不到关于如何使用它的明确参考 - 也许你可以做得更好,如果你花费更多的时间,而不是一两分钟我在搜索框中键入“ARM缓存刷新”并阅读结果。
在任何情况下,您都应该能够通过定期发出“刷新”指令来清除您不再需要的A和B部分,从而达到您想要的近似值。