圖像處理算法的各種優化【持續更新中】 原

首先,必須給開源中國的博客系統點個贊,右邊的標題導航真的很方便,跟CSDN"十幾年"一塵不變的畫風比起來真的甩了好幾條街,說不定一言不合就超越CSDN了(什麼?已經超越了?)~以下內容目前只是大膽猜測、感覺、沒有查閱過一些資料(這樣的資料好像很難找,其實是我蠢),不對的地方希望被指正。

由於之前沒做過相關優化,所以做一些猜想吧,大概分這麼幾種:

1、寄存器級優化

OpenCV裏filter2D的double型以4元素爲一組的計算應該就是這個套路。實測能降低42.8%的時間開銷(當然,只針對某一芯片)

2、指令集優化

比如SSE,這個很經典!

3、Cache級優化

由於Cache 的訪問速度比主存快好幾個數量級,所以如果CPU調度指令能夠較準命中數據塊的話,對於算法執行的效率提升有極大幫助,畢竟如果Cachemiss太高導致執行週期過長的話很可能就要輪更多的時間片了,而這樣所帶來的耗時就會漲數量級了。感覺在實踐的時候要注意指針、索引之類的不要太過於"遠程",不然EBP會給調度程序帶來錯覺而導致Cachemiss。

4、內存級優化

雖然內存訪問很slow,但是畢竟比磁盤快-_-,好吧,常見的可能就是複用了,畢竟有時候malloc/alloc/.....也會慢!而且還會造成內存碎片,不方便管理,尤其是諸如C#的高級語言,是很忌諱動態地去增長內存,堆很胖不方便上樓梯。

5、數據類型優化

跟前端的師兄討教時,他直接吐槽本寶寶用double,確實,double能不用千萬不用,編譯器想優化都有心無力,而且又浪費存儲;只是當初預研的時候想盡量保持精度,以最好的姿勢去運行,並未被告知還需要移植。。。

不廢話了,常見的就是降到float,不過據說float在前端都很少見,畢竟SIMD裏一般double只能並行兩個,而float能並行4個,該方法是本人能夠間接證實的。

還有就是換整型,因爲數量級本質上也是一種精度表述;double的有效數位再多,冪次跟不上一旦pooling,那麼權值就相當於0了;有的時候在Normalize後256量化下直接就是0,所以還不如換整型。現在接觸這塊總算明白爲什麼很多人習慣用299,587,114了,畢竟前面帶個小數點總感覺有毒。而整型的add/sub/mul/div就要比浮點的快很多指令週期了。一般int最大值4,294,967,295,而普通的圖像2kx2k=4kk,分辨度/靈敏度完全夠用了。

6、代碼循環的優化

一般遵循小循環裏套大循環的原則。

7、降採樣

這是一種很常見的方法,x4倍速提升效率,甚至更高(考慮到Cache優化策略)。

8、等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章