我想在ARM Cortex A8處理器上移植一小段代碼。 L1緩存和L2緩存都非常有限。我的程序中有3個數組。其中兩個按順序訪問(大小>數組A:6MB和數組B:3MB),第三個數組(大小>數組C:3MB)的訪問模式是不可預知的。儘管計算並不十分嚴格,但是對於訪問數組C來說存在巨大的緩存未命中。我認爲的一個解決方案是爲數組C分配更多的緩存(L2)空間,但對於數組A而言則更少B.但是我不能找到任何方式來實現這一點。我經歷了ARM的預加載引擎,但找不到任何有用的東西。優化不同陣列的ARM緩存使用率
6
A
回答
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中不再需要的部分,從而達到所需的近似值。
相關問題
- 1. 如何優化VBO/IBO以最大化GPU緩存使用率
- 2. 優化陣列內存使用
- 3. 陣列的緩存缺失率
- 4. 爲Resque優化內存使用率
- 5. 優化陣列
- 6. 優化APC緩存
- 7. JSPM優化緩存
- 8. 二維陣列緩存misss /緩存缺失率
- 9. Hibernate優化,使用二級緩存?
- 10. 爲不同分辨率優化頁面
- 11. 在C99中用不同索引優化'for-loops'陣列
- 12. ARM ASM +陣列
- 13. 優化SQL Server緩存
- 14. Dijkstra算法優化/緩存
- 15. 緩存優化理論
- 16. 優化報告緩存
- 17. iOS - 優化。緩存圖像
- 18. ARM Cortex-A8:如何測量高速緩存利用率?
- 19. Php陣列緩存
- 20. 優化ARM絕對跳轉
- 21. 用Cython優化numpy的陣列求和
- 22. 效率優化
- 23. 概率優化
- 24. 在GCC中使用內聯ARM彙編時優化使用的寄存器
- 25. 優化陣列反相
- 26. 優化C++ 2-d陣列
- 27. 多維陣列優化 - MATLAB
- 28. 陣列性能/優化
- 29. MySQL優化 - MySQL的最大內存使用率很高
- 30. 測量緩存內存使用率