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

看板MATLAB作者 (藍廳)時間9年前 (2016/02/21 01:36), 編輯推噓1(106)
留言7則, 2人參與, 最新討論串1/2 (看更多)
各位先進好 小弟用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的話每個運算都會變成兩層的迴圈 三維就變成三層...我實在不確定這樣能否提升效率 因為這是一個滿浩大的工程所以不想要到最後做半天反而速度更慢 有大大能提供意見嗎?感激不盡 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.230.213.146 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1455989799.A.967.html

02/21 02:07, , 1F
首先,後面矩陣相減可用內建指令diff。就你目前寫出來的部
02/21 02:07, 1F

02/21 02:07, , 2F
份,看不出什麼明顯可加速的地方。不過我很好奇為什麼要一
02/21 02:07, 2F

02/21 02:07, , 3F
直指定矩陣範圍?
02/21 02:07, 3F

02/21 12:24, , 4F
因為實際上的程式一個矩陣的不同部分是要做不一樣的運算
02/21 12:24, 4F

02/22 18:38, , 5F
不會變慢,但變快多少要視你整個code而定。
02/22 18:38, 5F

02/22 18:39, , 6F
如果你在意速度,籍此機會熟悉C或fortran不是件壞事
02/22 18:39, 6F

02/22 18:39, , 7F
所以我建議有時間有心力可以試試mex
02/22 18:39, 7F
文章代碼(AID): #1MoAGdbd (MATLAB)
文章代碼(AID): #1MoAGdbd (MATLAB)