使用movidius進行開發(fā)也快一年了命咐,越來越覺得這是款非常強大的芯片宫纬,這里記錄一下一些性能優(yōu)化的心得殿漠。
結(jié)論
1)shave上使用CMX內(nèi)存比DDR速度會快2-3倍
2)使用匯編優(yōu)化比單純的硬件指令可以快幾倍
優(yōu)化中些常用方法
1)先在PC端進行代碼優(yōu)化闺兢,完成PC版本的結(jié)果一致性檢查后再放到movidius上去跑雇初。在PC端將代碼寫成純C然后保證結(jié)果一致、同時注意內(nèi)存用量的話烁兰,移植到movidius上基本都可以一步成功耐亏。
2)做好版本管理,執(zhí)行優(yōu)化前優(yōu)化后運算結(jié)果一致性比對沪斟。代碼優(yōu)化是一個比較精細的活广辰,稍不注意就可能會導致出錯,所以進行代碼改動必須時常進行一致性結(jié)果驗證主之。我自己一般是會跑離線數(shù)據(jù)择吊,再將當前結(jié)果和上一次結(jié)果比對,假如有不一致槽奕,就通過版本管理軟件檢查改動的代碼
3)盡量將算法寫成可以按行序進行運算的几睛,這樣的話可以將數(shù)據(jù)通過DMA加載到CMX內(nèi)存進行處理。這是優(yōu)化中最有效的一個手段粤攒,假如被訪問的數(shù)據(jù)存放在DDR上所森,訪問速度太慢必然會拖累處理器的運算能力
4)將一些密集運算部分的代碼,盡量改寫能使用硬件指令的結(jié)構(gòu)夯接。有一些密集運算焕济,可能不能直接使用硬件指令,但是通過緩存盔几、構(gòu)造中間結(jié)果吼蚁,仍然可以使用硬件指令來加速
5)嘗試使用匯編指令,這是最終極的優(yōu)化手段问欠,現(xiàn)在還不怎么熟悉這個肝匆,以后有機會補上~~
錯誤排查
有時候代碼在PC端運行得好好的,運行結(jié)果也一致顺献,但是跑到movidius上結(jié)果就是不對旗国,這是優(yōu)化過程中經(jīng)常會碰到的事,有時候排查起來確實讓人抓狂注整,但是應對起來也是有一些方法的
1)檢查內(nèi)存用量
?movidius上每個shave的CMX內(nèi)存容量是有限的能曾,數(shù)據(jù)空間一般都才60K左右(另外剩余的配置成代碼空間)度硝,假如shave上一個過程中,占用的內(nèi)存量超過了配置的數(shù)據(jù)空間用量寿冕,運行起來后就很有可能導致結(jié)果異常
2)檢查是否有刷新緩存
? 假如shave上對DDR寫入了數(shù)據(jù)蕊程,然后再到RT側(cè)去取數(shù)據(jù),這個時候就要刷新下緩存驼唱,不然的RT側(cè)訪問到的數(shù)據(jù)可能還是先前緩存的舊數(shù)據(jù)藻茂。剛開始使用movidius開發(fā)的時候經(jīng)常碰到這個問題,明明shave上代碼沒問題玫恳,為啥就是沒正確的數(shù)據(jù)輸出~~辨赐!
3)使用排除法
將部分可能代碼排除再運行,基本可以定位到有問題的地方
一些坑
1)dma操作的時候京办,假如拷貝的數(shù)據(jù)長度為0掀序,會直接導致movidius卡死,所以dma操作前一定得判斷下拷貝的數(shù)據(jù)長度是否為0
2)movidius上一些庫的匯編版本和c版本結(jié)果不一致惭婿,很多時候匯編版本要求傳入的數(shù)據(jù)長度是16的整數(shù)倍不恭,不然結(jié)果可能異常
暫時寫這么多,后面想到別的再補充~~