计算化学公社

标题: 请教一个关于超长代码的方程执行效率的问题 [打印本页]

作者
Author:
Shannon    时间: 2014-12-12 03:44
标题: 请教一个关于超长代码的方程执行效率的问题
用matlab写了一个超长代码的方程(960行....),有个很奇怪的现象,当我使用一个循环反复调用这个方程的时候,速度飞快。
比如:
tic
for test =1:1000
     t=floor(3*rand);
     u=floor(3*rand);
      v=floor(3*rand);
          alpha=rand;
      A=rand(1,3);
rfunccode (t,u,v,alpha,A,Farray) ;
end
toc

比使用老的迭代代码快了 10倍。

但将这个方程应用在计算积分的 代码中调用的话,反倒是慢了不少。 即使是将代码写成C++还是比原来的老代码要慢。
这种现象难道是因为 计算机读取代码需要花不少时间?请问,有啥解决办法吗?
代码大约结构如下: 是一个将迭 代 暴_力_拆_开的代码
if x==0
if y==0
if z==0
R0000=R000 (0,alpha,A,Farray)  ;

result =R0000;
elseif z==1
R0001=R000 (1,alpha,A,Farray)  ;

result =Az*(R0001);
elseif z==2
R0001=R000 (1,alpha,A,Farray)  ;
R0002=R000 (2,alpha,A,Farray)  ;

result =(R0001)+Az*(Az*(R0002));
elseif z==3
R0002=R000 (2,alpha,A,Farray)  ;
R0003=R000 (3,alpha,A,Farray)  ;

result =(2)*(Az*(R0002))+Az*((R0002)+Az*(Az*(R0003)));


作者
Author:
qwoop    时间: 2015-1-15 09:34
Matlab这种脚本语言在“构造”每一段执行对象的时间消耗很大,这也就是它的循环能力很弱的原因。个人觉得向量化,或者采用JIT可能会有帮助。
作者
Author:
Shannon    时间: 2015-1-15 10:01
qwoop 发表于 2015-1-15 09:34
Matlab这种脚本语言在“构造”每一段执行对象的时间消耗很大,这也就是它的循环能力很弱的原因。个人觉得向 ...

JIT目前版本已经默认打开了, 我后来用matlab的C语言转化工具转成C代码,速度也没有变化太多,似乎forloop的速度不是主要原因了。 我目前认为这个问题主要是因为直接用 forloop循环内层代码的话,因为内存读取到寄存器的原因。大概能得到某些加速。
目前在用这个代码学习如何用fortran,c++写 那个boys方程的算法然后对比速度玩。おもしろい!




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3