Re: [討論] for迴圈改用.cpp的mex函數加速問題

看板MATLAB作者 (天)時間9年前 (2016/02/23 20:11), 9年前編輯推噓3(301)
留言4則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《w0005151 (藍廳)》之銘言: : 各位先進好 : 小弟用matlab寫FDTD(一種將電磁波的偏微分方程離散化求解的數值方法) : 這個程式的架構很簡單 : 一開始先定義完各項參數後最後以一個for迴圈作結 : 迴圈裡面做的事情為矩陣運算 : 大概長得像這樣 : for t=1:tnum %tnum大約為10000~50000 : Ez(a:b,c:d)=A.*Ez(a:b,c:d)+B.*(Hx(a+1:b+1,c:d)-Hx(a:b,c:d)); : Hx(a:b,c:d)=C.*Hx(a:b,c:d)+D.*(Ez(a+1:b+1,c:d)-Ez(a:b,c:d)); : end : Ez,Hx,A,B,C,D都是矩陣 : 他們的大小視運算需求為定 : 迴圈裡面沒有其他迴圈 : 就只是把幾個矩陣做疊代運算而已 : 當然實際的code迴圈裡不是只有兩行而已 : 大約有10行左右,全都是這類的運算 : 一般來說這些矩陣的大小在600*600以內的計算速度都還可以接受 : 但是到1000*1000以上後又要跑較大的tnum時就會滿慢的了 : 最大的問題是這個程式寫到三維版本時,這些矩陣全部變成三維矩陣 : 迴圈仍然為單一迴圈裡,但運算式的量也大約變成三倍,其計算速度令人難以接受 : 曾經跑過一個三維的版本,矩陣大小約為500*400*100 : 一跑下去沒個三天以上是不會好的 : 最近在想因為matlab可以使用以C/C++編譯的.mex檔函數 : 我想知道若把這個for迴圈全部包成一個.mex檔執行的話能明顯提升運算速度嗎 : 雖然在simulink的時候把一些功能包成C的S-function的確大大提升速度 : 但二維矩陣運算用C的話每個運算都會變成兩層的迴圈 : 三維就變成三層...我實在不確定這樣能否提升效率 : 因為這是一個滿浩大的工程所以不想要到最後做半天反而速度更慢 : 有大大能提供意見嗎?感激不盡 MatLab code: http://pastebin.com/FvSHk45D (test_c.cpp後來懶惰沒寫) C++ code: http://pastebin.com/tfYwbhBA environment: i7-5820K@4.0GHz, windows 7 SP1, Visual Studio 2013, Intel Parallel Studio XE 2015, MatLab R2015b, armadillo 6.5000.5 MatLab版本: Elapsed time is 60.614941 seconds. C++版本: Elapsed time is 48.771419 seconds. C++版本,我比較偷懶直接用armadillo的class比較快,就不用手寫一個個乘... 看的出來,只是每個矩陣對乘加速有限 最後,如果用GPU的話,加速效果較佳 下面測試是用i7-3770K@4.4GHz with nVidia GTX 670 % MATLAB gpu Ez_gpu = gpuArray(Ez); Hx_gpu = gpuArray(Hx); A_gpu = gpuArray(A); B_gpu = gpuArray(B); C_gpu = gpuArray(C); D_gpu = gpuArray(D); tic for t=1:tnum Ez_gpu(a:b,c:d)=A_gpu.*Ez_gpu(a:b,c:d) + ... B_gpu.*(Hx_gpu(a+1:b+1,c:d)-Hx_gpu(a:b,c:d)); Hx_gpu(a:b,c:d)=C_gpu.*Hx_gpu(a:b,c:d) + ... D_gpu.*(Ez_gpu(a+1:b+1,c:d)-Ez_gpu(a:b,c:d)); end toc gpuArray: Elapsed time is 7.242466 seconds. PS: 編譯所需的intel_cpp_15_vs2013.xml來自: https://gist.github.com/amroamroamro/414abe0b2a6002cd8945 -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) http://tinyurl.com/1LhSWhpH data.table #1LhW7Tvj (R_Language) http://tinyurl.com/1LhW7Tvj dplyr(上) #1LhpJCfB (R_Language) http://tinyurl.com/1LhpJCfB dplyr(下) #1Lhw8b-s (R_Language) tidyr #1Liqls1R (R_Language) http://tinyurl.com/1Liqls1R -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.73.234 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1456229494.A.980.html

02/23 21:18, , 1F
用GPU應是正解,另外自己寫mex的問題是,沒辦法多核心
02/23 21:18, 1F

02/23 21:19, , 2F
這種BLAS程度的東西,matlab應該有多核心
02/23 21:19, 2F
我用multi-threaded MKL 有發現嗎XDD

02/24 00:28, , 3F
喔喔,但是intel mkl要再花錢買?
02/24 00:28, 3F

02/24 11:42, , 4F
不過gpu也是要花錢買顯卡就是了....
02/24 11:42, 4F
是阿,不過顯示卡相對便宜不少 ※ 編輯: celestialgod (140.109.74.87), 02/24/2016 11:50:52
文章代碼(AID): #1Mp4nsc0 (MATLAB)
文章代碼(AID): #1Mp4nsc0 (MATLAB)