Saturday, August 26, 2006

How slow Matlab is

Matlab是個計算、分析、模擬、視覺呈現的好工具 ,在fMRI資料分析中最常被使用的SPM也是用Matlab寫成的。可是,由於它使用那種要執行時才編譯的程式語言,速度上自然比不上事先compile好的程式(如:IDL)。

此外,即使在PC運算速度隨著多核心CPU的出現而大幅提升的時候,Matlab仍然『秉持』著單緒(single thread)的架構,只能用到單一核心,完全無法受惠....Orz

而Matlab對於提高效能的需求,提出的方案卻是要你花大錢買他的Distributed Computing Toolbox,像clustering一樣將運算分散在多台電腦上執行。以8台電腦的授權為單位,要價4000USD,所以花4000元只能頂多把速度提高8倍,這還不包括買電腦要花的錢。

Matlab有多慢?像我用nonlinear curve fitting來計算一組3D whole-brain的MRI T1 map就需要8 hr(CPU: Pentium4 3.2GHz with 2GB RAM)。所以即使用8台電腦的cluster來跑,也要1 hr,完全無法on line看到結果。

逼不得已,只好用C來改寫。curve fitting用網路上levmar這個很棒的Levenberg-Marquardt nonlinear least squares algorithm,配合Intel的C++ Compiler。結果,同一組data,計算時間各位猜多久?大概1.5 min--也就是速度至少比Matlab快300倍

事實上,Matlab內建的function執行起來確實不快,比方說,corrcoef這個計算相關係數的函式就比網友提供的prcorr210倍

結論是,如果你在處理大量數據中某個function是bottle neck的話,把它用C/C++改寫,應該會省下不少時間。

2 comments:

Anonymous said...

自己去写那些复杂的 MARTIX程序,人工是很贵的,而且你还未必能保证其正确性,速度会优于MATLAB,所以first choice 还是matlab
Matlab里的MEX已经比以前好用多了,可以很好的和c结合起来了

Kai said...

是沒錯,或許可以試試看寫成MEX,不知道效能跟獨立的C程式差多少,此外,也不知道Matlab能不能支援multi-thread的MEX。