计算化学公社

 找回密码 Forget password
 注册 Register
Views: 4310|回复 Reply: 2
打印 Print 上一主题 Last thread 下一主题 Next thread

[数值算法] 请教一个关于超长代码的方程执行效率的问题

[复制链接 Copy URL]

127

帖子

1

威望

1231

eV
积分
1378

Level 4 (黑子)

跳转到指定楼层 Go to specific reply
楼主
用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)));

99

帖子

0

威望

1092

eV
积分
1191

Level 4 (黑子)

2#
发表于 Post on 2015-1-15 09:34:22 | 只看该作者 Only view this author
Matlab这种脚本语言在“构造”每一段执行对象的时间消耗很大,这也就是它的循环能力很弱的原因。个人觉得向量化,或者采用JIT可能会有帮助。

127

帖子

1

威望

1231

eV
积分
1378

Level 4 (黑子)

3#
 楼主 Author| 发表于 Post on 2015-1-15 10:01:25 | 只看该作者 Only view this author
qwoop 发表于 2015-1-15 09:34
Matlab这种脚本语言在“构造”每一段执行对象的时间消耗很大,这也就是它的循环能力很弱的原因。个人觉得向 ...

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

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-23 18:57 , Processed in 0.148506 second(s), 21 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list