標籤:

matlab計算速度?

matlab計算速度是快還是慢呢?進行512X512的矩陣奇異值分解只要0.2s左右


我正好做了一些對matlab程序加速的項目,我在這分享一下吧。

首先matlab並不是高效的,我們應該清楚。雖然他使用了mkl庫,也做了很多向量優化,但是對於他這種腳本語言,在保證通用性的情況下,是很難保證效率的。

從我優化的經驗上來看,使用matlab,切記不要使用for循環,這會極大地拉低效率。

給大家舉個例子,我優化了一個matlab程序,其中用到了反覆迭代,去擬合結果,用原生的matlab跑需要2個小時,用c語言重寫後,只需要幾分鐘。問題出在哪了呢?因為程序中包含一個for循環的迭代過程,還有大量的程序調用。

為什麼程序調用和for循環迭代會拉低效率呢?

首先,matlab對函數的參數,是沒有傳引用這種方法的,是將參數進行拷貝,然後才進行傳遞。更通俗點說,他不能像c語言那樣,傳一個指針進函數,必須要把一個數組複製一遍,然後把複製的數組傳進去。這不僅消耗了內存,還消耗了時間。

for循環為什麼會低呢?matlab程序語句調用的開銷是很大的。彌補的方式是利用向量化。但是for循環前後有依賴關係,是不能進行向量化操作的,這造成了for迭代效率低。

解決辦法很簡單,也有複雜的。

方法一:利用matlab的coder將核心計算函數反編譯成c程序。但這個程序可讀性較低。不過對其性能提升已經有了很大幫助了,至少能提高2~3倍的效率。

方法二:手動寫c擴展,然後用mex編譯成matlab插件。為什麼要手寫呢,因為matlab還是不太智能,它反編譯的c程序有很多冗餘內容。自己手動寫的擴展,效率提升會更大。而且還可以用上intel那套高性能套件,去手動進行向量化等,對性能提升又是一個助力。

=====================================

串列的程序是很難挑戰並行程序的權威的。matlab並行化可以用他的parallel toolbox。但其實他的效率並不高。hack的方法,是用matlab調用mex的c擴展,然後在c程序中開一個進程池,然後自己手動進行調度。不過這有點複雜。對於一般的程序,worker就足夠了。

然後就是gpu擴展了。matlab是原生支持cuda的。但是其效率並不高。如果直接用gpuArray的話,執行簡單的操作時很高效的,但是邏輯複雜的話,就不要用這個了。matlab支持直接調用cuda函數,是通過使用gpuFavel。也可以用mex編譯,這樣效率是最好的。

還有一些優化方法,好多都是細節上的。優化到極致,在不改演算法的情況下,快幾十倍,是一件不太困難的實情。


對於向量化的運算,你不太可能寫出一個比matlab更快的了


看你的應用場景,如果你單純把matlab作為一個數值計算的計算器來用,快,應該是最快的之一,因為底層用了高度優化的高效計算庫,所以你自己用標準C來寫,都比不上它的速度.

但是一般而言一個完整的程序都不會是一個單純的數值計算,如果你要打開關閉文件,要用到很多函數,要有循環和判斷,那麼,慢,慢的慘不忍睹.


循環慢矩陣快;

特定函數快(如fft),其他的函數慢;

總體上比C和Fortran慢;

數值計算比Python和其他腳本快。

最重要的開發速度快


做symbolic計算的話慢死爹了~~


推薦閱讀:

這個Matlab圖像應用了什麼命令?
如何用matlab繪製三維的頻譜圖(時間-頻率-能量)?
為什麼有些程序員會鄙視MATLAB?

TAG:MATLAB |