2010-03-04 25 views
6

我想在ARM Cortex A8處理器上移植一小段代碼。 L1緩存和L2緩存都非常有限。我的程序中有3個數組。其中兩個按順序訪問(大小>數組A:6MB和數組B:3MB),第三個數組(大小>數組C:3MB)的訪問模式是不可預知的。儘管計算並不十分嚴格,但是對於訪問數組C來說存在巨大的緩存未命中。我認爲的一個解決方案是爲數組C分配更多的緩存(L2)空間,但對於數組A而言則更少B.但是我不能找到任何方式來實現這一點。我經歷了ARM的預加載引擎,但找不到任何有用的東西。優化不同陣列的ARM緩存使用率

回答

1

這將是一個好主意,分裂緩存並分配每個陣列的不同部分。

不幸的是,這是不可能的。 CortexA8的緩存並不是那麼靈活。好的舊StrongArm有一個二級緩存來完成這個分割目的,但它不再可用。我們有L1和L2緩存,而不是(整體良好的變化恕我直言)

然而,有一件事可以做:

中的CortexA8的NEON SIMD單元,通過約10通用處理單元滯後處理器週期。通過巧妙的編程,您可以從通用單元發出緩存預取,但可以通過NEON進行訪問。兩條流水線之間的延遲使緩存有時間進行預取,因此平均緩存未命中時間會更短。

缺點是,如果您決不能將計算結果從NEON移回ARM單元。由於NEON滯後,會導致整個CPU管道刷新。幾乎如果不是更高成本的緩存未命中。

性能的差異可能很大。出乎意料的是,我期望有20%到30%的速度提升。

0

從我能夠通過Google找到的內容看起來像ARMv7(這是Cortex A8支持的ISA版本)具有緩存刷新功能,但我無法找到有關如何使用它的明確參考 - - 如果你花費更多的時間,那麼你可以做得更好,而不是花一兩分鐘在搜索框中輸入「ARM cache flush」並讀取結果。

在任何情況下,您都應該能夠通過定期發出「同花順」指令來清除A和B中不再需要的部分,從而達到所需的近似值。