[閒聊] video filter 效能

作者: erspicu (.)   2015-12-17 12:24:53
https://github.com/erspicu/filter_test
通常要求即時性的vidoe filter應該少會用全C#去實作,
不過一方面是為了好奇.一方面是挑戰C#效能極限.一方面是相容考量,
所以還是嘗試用純C#來擔任模擬器電玩常見的ScaleX HQX XBRz filter處理任務....
不過除了 ScaleX 外 , HQX跟XBRz 都是移植人家已經寫好的C#改寫方案,
再加上修改減化.重構.效能校調來的....
很刺激...你會發現改了啥地方,突然FPS竄升起來,或是幾個零零星星的小地方改一改,
效能累積起來就提升不少,目前除了HQ6X (HQ3*HQ2)效能我覺得不太及格外,
其他擔任一般古早機的scaler,以現在普遍的電腦效能來處理大概都算.
目前這幾個filter,xbrz跟hqx都還有不少校能改善空間,對這種議題有興趣的,
可能嘗試修改看看.
大概的心得是,其實cost最高的是任何跟array數據存取的部分,
也就是說效能瓶頸主要是array記憶體這塊,也難怪記憶體硬體還一直在進化中….
其他什麼 加減乘除 邏輯判斷等等的cost反來相當低…
但若真的太多累贅的code,同樣會拖慢….
另外method展開,照理說少了stack push pop返回等動作效能會提升,
但若是展開的code太長太多塞起來,效能反來會大下降,
可能跟code 本身 loading的時間有關係.
這種需求下,其實原則就是程式能盡量簡單就簡單些,看起來酷酷很先進的寫法,
能不用就不要去用,不過這種求精簡破壞物件化結構和維護方便性的做法,
除非特殊原因,不然也不建議.
作者: fo40225   2015-12-17 22:46:00
要更快就要用unsafe去存取array與bitmap我看了啊 看到都是用SetPixel 這就慢啊.net4.6 x64可以用CPU SIMD加速 那些矩陣處理也可以更快如果計算量夠大 用C++AMP寫邏輯給C#用可以比pfor快
作者: Litfal (Litfal)   2015-12-18 16:35:00
如果是相容考量,C++應該更好一些,不過得看你相容什麼XD然後filter系的優化,可以用動態產生IL的技巧,把一些不必要的運算直接去掉,例如x1、x0、x-1這種在filter裡面常出現的。直接動態產生IL的方式,我比較推薦Expression Tree自己寫IL code有點辛苦,雖然有時是必要的...
作者: fo40225   2015-12-18 16:43:00
文章 專案沒看懂是我的問題 抱歉但我認為在ScaleImage內的操作 展開成那樣JIT的優化都沒了 還不如用unsafe + SIMD 可讀會回來一些這樣也還算是在C#內實作吧?畢竟unsafe操作指標也是C#規格如果操作array是瓶頸那就用unsafe去改都用上pfor平行操作多筆資料了 用上SIMD一次操作更多不是用pfor操作還有可能有CPU cache miss問題展開減少stack push pop也可以試試MethodImplOptionsMethodImplOptions.AggressiveInlining

Links booklink

Contact Us: admin [ a t ] ucptt.com