作者w0005151 (蓝厅)
看板MATLAB
标题[讨论] for回圈改用.cpp的mex函数加速问题
时间Sun Feb 21 01:36:37 2016
各位先进好
小弟用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://webptt.com/cn.aspx?n=bbs/MATLAB/M.1455989799.A.967.html
1F:推 sunev: 首先,後面矩阵相减可用内建指令diff。就你目前写出来的部 02/21 02:07
2F:→ sunev: 份,看不出什麽明显可加速的地方。不过我很好奇为什麽要一 02/21 02:07
3F:→ sunev: 直指定矩阵范围? 02/21 02:07
4F:→ w0005151: 因为实际上的程式一个矩阵的不同部分是要做不一样的运算 02/21 12:24
5F:→ sunev: 不会变慢,但变快多少要视你整个code而定。 02/22 18:38
6F:→ sunev: 如果你在意速度,籍此机会熟悉C或fortran不是件坏事 02/22 18:39
7F:→ sunev: 所以我建议有时间有心力可以试试mex 02/22 18:39