演算法優化的一般方法 以ARM平台為例

2021-10-12 07:04:14 字數 1098 閱讀 9170

一、為什麼要進行演算法優化?

二、演算法優化方法

演算法在部署到硬體平台時,對於效能的要求非常高,如果不進行一定程度的優化,演算法耗時一般來講都難以滿足要求。

演算法優化的一般思路如下圖。優化的思想可以看成乙個金字塔,分為方案改進、平台優化和區域性熱點優化幾個部分,在金子塔的底部進行優化效果最好,越往上對效能的提公升越少。

優化的通用流程是,先分析優化的需求是否合理,評估一下該需求是否可以實現,然後分析演算法效能,找出演算法的瓶頸在**,是算力、計算量、頻寬等因素中的哪乙個影響了耗時。通常**的耗時應該滿足二八原則,即20%的**消耗80%的時間。優化的策略應該從大到小,從整體到區域性,然後不斷進行迭代,直到達到需求

使用更先進的演算法替換原有演算法;

整理資料流,減少無效處理,減少資料拷貝,減少記憶體間的讀寫依賴;

exp、log、sin等計算用查表法替代;用位操作代替乘法、除法等運算;避免不必要的除法運算(整數除法是整數運算中最慢的)

a) 指令cache優化

將呼叫次數較多的函式設定為inline函式,減少函式呼叫開銷,減小指令跳轉,使得指令cache命中率變高。

b)資料cache優化

void __builtin_prefetch (const void *addr, ...)
資料重排:把資料重新排列,使其對cache訪問友好,減少cache miss。可參考 ai | 如何實現高速卷積?深度學習庫使用了這些「黑魔法」

不同處理單元並行(arm、dsp等)或者多個cpu並行(可使用openmp介面)

a)迴圈優化

將迴圈展開;將最忙的迴圈放在最內層;盡可能將判斷放在迴圈外進行。

b)編譯優化

合適的編譯級別(-o0\-o1\-o2\-o3);利用restrict關鍵字、register變數;快速數學計算(-ffast-math)等

利用neon指令進行優化,實現simd(單指令多資料)

a)資料寬度降低

32位浮點數簡化為8位整型

b)位址對其

資料位址對齊,減少不必要的記憶體訪問開銷

一般Fibonacci演算法的優化

一般的fibonacci演算法 int fibonacci int number 該演算法的時間複雜度達到了驚人的指數級別,效率慢的不行,下面提供兩種不同的改進方式,時間複雜度分別為o n 和o logn 方法一 o n int fibonacci int number int result 0 f...

nginx的一般優化

user nobody worker processes 1 此數跟cpu的核心數是一致的 error log logs error.log error log logs error.log notice error log logs error.log info 日誌等級 debug info n...

nginx的一般優化

nginx的一般優化 user nobody worker processes 1 此數跟cpu的核心數是一致的 error log logs error.log error log logs error.log notice error log logs error.log info 日誌等級 d...