回答
以下是我在處理這類代碼時需要考慮的一些事情。
- 考慮您是否想要「結構的數組」或「結構數組」。你想要使用的將取決於數據的每一部分。
- 嘗試將結構保持爲32個字節的倍數,以便均勻地打包緩存行。
- 在冷熱元素中對數據進行分區。如果你有一組o類的對象,並且你經常一起使用ox,oy,oz,但偶爾需要訪問oi,oj,那麼請考慮將ox,oy和oz放在一起,然後移動i,j和k部分到平行的腋窩數據結構。
- 如果您有多維數據數組,然後使用通常的行順序佈局,則沿着首選維度掃描時訪問速度會非常快,而在其他位置掃描時會非常緩慢。沿着任何維度遍歷時,沿着space-fillingcurve映射它將有助於平衡訪問速度。 (阻塞技術是相似的 - 它們只是具有較大基數的Z階。)
- 如果您必須導致緩存未命中,請嘗試儘可能多地使用該數據來分攤成本。
- 你在做什麼多線程?注意緩存一致性協議的減速。填充標誌和小計數器,以便它們位於單獨的緩存行中。
- 英特爾的SSE提供了一些預取內在函數,前提是您知道提前訪問的內容。
允許CPU有效地預取數據。例如,您可以減少按行處理多維數組的數量緩存未命中,而不是按列,展開循環等。
這種優化取決於硬件架構,因此您最好使用某種平臺特定的分析器,如英特爾VTune檢測緩存可能存在的問題。
薩特在那裏講話。幻燈片在這裏可以找到,因爲它的質量有點糟糕,所以很高興看到視頻。 http://www.nwcpp.org/Downloads/2007/Machine_Architecture_-_NWCPP.pdf – Zoomulator 2012-01-17 23:01:27
避免在沒有必要時使用動態內存。使用新的,刪除,智能指針等,往往會將你的程序數據傳播到內存中。這不好。如果您可以將大部分數據保存在一起(例如通過在堆棧中聲明對象),緩存肯定會更好。
內聯函數運行會危害指令緩存。如果內存沒有被綁定,那麼就不太可能產生太多(如果有)差異。
與往常一樣,任何優化都應該通過分析而不是直覺告知。更不用說,您需要了解剖析器告訴您的內容,這意味着熟悉彙編語言以及您正在優化的plaftorm的特定特性。
現在有點老了,但邁克Abrash的「圖形編程黑皮書」仍然有很多很好的一般建議。
另外,如果你在做C++和多線程,你需要考慮每個處理器的緩存上的虛假共享,局部性和數據的熱度。這可以造成很大的差異。尤其在多線程計算中,採用LIFO方式的計算比以FIFO方式進行計算更有效,但它在單處理器體系結構中也是有效的。
- 1. opencv數據通過xml存儲優秀?
- 2. 減少指令高速緩存未命中(在C++)
- 3. 需要優秀的設計模式來緩存數據庫查詢結果集
- 4. 設計緩存優化的N元樹
- 5. 減少java中的文件緩存
- 6. 減少CUDA parallization中的內存命中
- 7. Hibernate的緩存未命中
- 8. 減少通過SmtpClient發送的郵件中的X-Spam命中()
- 9. 通知功能通過總結計數減少類似活動
- 10. datomic緩存和緩存未命中
- 11. 計算緩存內存命中和Miss,並計算緩存中的行數
- 12. 厄蘭過程減少計數
- 13. Ehcache中「緩存未命中」和「內存緩存未命中」有什麼區別?
- 14. iphone緩存未命中
- 15. 在ASP.NET中使用SessionID + MemoryCache安全和優秀的設計?
- 16. 如何通過awk命令減少數據?
- 17. 減少通過UI網
- 18. .NET。最大限度地減少內存使用/優化類設計
- 19. 緩存未命中與高速緩存命中
- 20. ASP.NET數據緩存設計
- 21. 存儲過程:減少表數據
- 22. OpenMP緩慢減少
- 23. 會計表設計優秀餘額由因天(0-30,31-60等)
- 24. 減少HTTP請求 - HTML緩存
- 25. 代碼優化:通過存儲返回值來減少方法調用
- 26. 通過減少API調用來優化性能
- 27. 通過javascript設置的背景圖像未被Chrome緩存
- 28. 減少冗餘的設計模式
- 29. 減少冗餘的SQL表設計
- 30. 用於Python的優秀設計器的GUI工具包
+1。希爾伯特曲線的想法是非常新穎的,你在哪裏提出的?是否需要在希爾伯特曲線座標和標準數組座標之間來回轉換,真的值得高速緩存效率,還是隻有在一個方向進行座標轉換,而不是另一個方向時,它才值得? – 2012-11-16 00:34:43