[讨论] for循环改用.cpp的mex函数加速问题

楼主: w0005151 (蓝厅)   2016-02-21 01:36:37
各位先进好
小弟用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的话每个运算都会变成两层的循环
三维就变成三层...我实在不确定这样能否提升效率
因为这是一个满浩大的工程所以不想要到最后做半天反而速度更慢
有大大能提供意见吗?感激不尽
作者: sunev (Veritas)   2016-02-22 18:38:00
不会变慢,但变快多少要视你整个code而定。如果你在意速度,籍此机会熟悉C或fortran不是件坏事所以我建议有时间有心力可以试试mex
楼主: w0005151 (蓝厅)   2016-02-21 12:24:00
因为实际上的程式一个矩阵的不同部分是要做不一样的运算
作者: sunev (Veritas)   2016-02-21 02:07:00
首先,后面矩阵相减可用内建指令diff。就你目前写出来的部份,看不出什么明显可加速的地方。不过我很好奇为什么要一直指定矩阵范围?

Links booklink

Contact Us: admin [ a t ] ucptt.com