odeint内存使用和执行时间 [英] odeint memory usage and execution time

查看:169
本文介绍了odeint内存使用和执行时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我注意到,与我的RK4算法或Mathematica的实现相比,odeint使用非常少的内存。对于相同的步长,odeint使用大约3.11GB,而我的程序使用7GB和与Mathematica,我不得不手动增加页面文件大小为40GB或者它用完内存。 (编辑: CPU使用率只有18%



我很好奇这是怎么可能的,因为当我保存结果,数据文件在所有三种情况下几乎是相同的大小。



然而,当涉及到执行时间,odeint似乎比我的程序或数学慢一个数量级。这是权衡正常吗?我做事情的超级noob 的方式。



编辑:2
**步长与执行时间**




  • 0.0005 = 2:55.59〜24.44小时500步

  • 0.001 = 1:29.14〜12.5小时500步

  • 0.005 = 0:17.19〜2.5小时,共500步。

  • 0.01 = 8.34〜1小时10分500步



例如:

  void Classical(vector< vector< double>& u1,矢量<双向>>>矢量<矢量>& u2,矢量<双>>& >& phi2,vector< double>& gamma,vector< double& z,double h,double u10,double u20,double theta_initial){

for(int i = i
double v1 = u10;
double v2 = u20;
double ph1 = 0.0;
double ph2 = 0.0;
double angle = delta [i]; // OK



u1.push_back(vector< double>());
u2.push_back(vector< double>());
phi1.push_back(vector< double>());
phi2.push_back(vector< double>());
theta.push_back(vector< double>());

for(int j = 0; j< z.size(); ++ j){



double k1 = 0.0; double k2 = 0.0; double k3 = 0.0; double k4 = 0.0;
double L1 = 0.0; double L2 = 0.0; double L3 = 0.0; double L4 = 0.0;
double m1 = 0.0; double m2 = 0.0; double m3 = 0.0; double m4 = 0.0;
double n1 = 0.0; double n2 = 0.0; double n3 = 0.0; double n4 = 0.0;


k1 = h *(v2 * v2-1.0)* cos((angle));
L1 = h *((2.0 /(1.0-(v2 * v2))) - (1.0 /(v2 * v2))* Gamma [i]
m1 = h *(1.0 /(1.0-(v2 * v2)))* Gamma [i]
n1 = h *(1.0 /((v2 * v2)))* Gamma [i]

k2 = h *((v2 + k1 / 2)*(v2 + k1 / 2)-1)* cos
L2 = h *((2.0 /(1 - ((v2 + k1 / 2)*(v2 + k1 / 2)))) - (1 /(v2 + k1 / k1 / 2))))* Gamma [i];
m2 = h *(1 /(1 - ((v2 + k1 / 2)*(v2 + k1 / 2)))* Gamma [i]
n2 = h *(1 /(((v2 + k1 / 2)*(v2 + k1 / 2)))* Gamma [i]

k3 = h *((v2 + k2 / 2)*(v2 + k2 / 2)-1)* cos
L3 = h *((2.0 /(1 - ((v2 + k2 / 2)*(v2 + k2 / 2)))) - (1 /((v2 + k2 / k2 / 2))))* Gamma [i];
m3 = h *(1 /(1 - ((v2 + k2 / 2)*(v2 + k2 / 2)))* Gamma [i]
n3 = h *(1 /(((v2 + k2 / 2)*(v2 + k2 / 2)))* Gamma [i]

k4 = h *((v2 + k3)*(v2 + k3)-1)* cos
L4 = h *((2.0 /(1 - ((v2 + k3)*(v2 + k3)))) - (1 /(v2 + k3)* Gamma [i];
m4 = h *(1 /(1 - ((v2 + k3)*(v2 + k3)))* Gamma [i]
n4 = h *(1 /(((v2 + k3)*(v2 + k3)))* Gamma [i]


v2 = v2 +(k1 / 6)+(k2 / 3)+(k3 / 3)+(k4 / 6)
angle = angle +(L1 / 6)+(L2 / 3)+(L3 / 3)+(L4 / 6)。
ph1 = ph1 +(m1 / 6)+(m2 / 3)+(m3 / 3)+(m4 / 6)
ph2 = ph2 +(n1 / 6)+(n2 / 3)+(n3 / 3)+(n4 / 6)

v1 = sqrt(1.0-(v2 * v2));

u1 [i] .push_back(v1);
u2 [i] .push_back(v2);
theta [i] .push_back(angle);
phi1 [i] .push_back(ph1);
phi2 [i] .push_back(ph2);
}


}

p>

解决方案

我认为你应该在发布模式中编译你的程序以启用编译器优化。 odeint使用大量的模板代码,这在编译时在调试模式下很慢。在发布模式下,性能会提高几个数量级。


I've noticed that odeint uses very little memory when compared to my implementation of the RK4 algorithm or Mathematica. For the same step size, odeint uses about 3.11GB while my program uses 7GB and with Mathematica, I have to manually increase the pagefile size to 40GB or else it runs out of memory. (Edit: CPU usage is only 18%)

I am curious on how this is possible because when I save the results, the data file is almost the same size in all three cases.

However, when it comes to execution time, odeint seems an order of magnitude slower than either my program or Mathematica. Is this tradeoff normal? I do things the super noob way.

Edit:2 ** Step Size vs Execution Time **

  • 0.0005=2:55.59 ~ 24.44hrs for 500 steps
  • 0.001=1:29.14 ~ 12.5hrs for 500 steps
  • 0.005= 0:17.19~ 2.5hrs for 500 steps.
  • 0.01= 8.34 ~ 1hr10min for 500 steps

For example:

void Classical(vector<vector<double> >& u1,vector<vector<double> >& u2,vector<vector<double> >& phi1,vector<double>& delta,vector<vector<double> >& theta,vector<vector<double> >& phi2, vector<double>& Gamma,vector<double>& z,double h,double u10,double u20,double theta_initial){

for(int i=0;i<delta.size();++i){ 

        double v1=u10;
        double v2=u20;
        double ph1=0.0;
        double ph2=0.0;
        double angle=delta[i]; //OK



    u1.push_back ( vector<double>() );
    u2.push_back ( vector<double>() );
    phi1.push_back ( vector<double>() );
    phi2.push_back ( vector<double>() );
    theta.push_back ( vector<double>() );

        for(int j=0;j<z.size();++j){



            double k1=0.0; double k2=0.0;double k3=0.0;double k4=0.0;
            double L1=0.0; double L2=0.0;double L3=0.0;double L4=0.0;
            double m1=0.0; double m2=0.0;double m3=0.0;double m4=0.0;
            double n1=0.0; double n2=0.0;double n3=0.0;double n4=0.0;                               


            k1=h*(v2*v2-1.0)*cos((angle));
            L1=h*( (2.0/(1.0-(v2*v2))) - (1.0/(v2*v2)) )*Gamma[i];
            m1=h*(1.0/(1.0-(v2*v2)))*Gamma[i];
            n1=h*(1.0/((v2*v2)))*Gamma[i];

            k2=h*((v2+k1/2)*(v2+k1/2)-1)*cos(((angle+L1/2)));
            L2=h*( (2.0/(1-((v2+k1/2)*(v2+k1/2)))) - (1/((v2+k1/2)*(v2+k1/2))) )*Gamma[i];
            m2=h*(1/(1-((v2+k1/2)*(v2+k1/2))))*Gamma[i];
            n2=h*(1/(((v2+k1/2)*(v2+k1/2))))*Gamma[i];

            k3=h*((v2+k2/2)*(v2+k2/2)-1)*cos(((angle+L2/2)));
            L3=h*( (2.0/(1-((v2+k2/2)*(v2+k2/2)))) - (1/((v2+k2/2)*(v2+k2/2))) )*Gamma[i];
            m3=h*(1/(1-((v2+k2/2)*(v2+k2/2))))*Gamma[i];
            n3=h*(1/(((v2+k2/2)*(v2+k2/2))))*Gamma[i];

            k4=h*((v2+k3)*(v2+k3)-1)*cos(((angle+L3)));
            L4=h*( (2.0/(1-((v2+k3)*(v2+k3)))) - (1/((v2+k3)*(v2+k3))) )*Gamma[i];
            m4=h*(1/(1-((v2+k3)*(v2+k3))))*Gamma[i];
            n4=h*(1/(((v2+k3)*(v2+k3))))*Gamma[i];


            v2=v2+(k1/6)+(k2/3)+(k3/3)+(k4/6); 
            angle=angle + (L1/6)+(L2/3)+(L3/3)+(L4/6);
            ph1=ph1+(m1/6)+(m2/3)+(m3/3)+(m4/6); 
            ph2=ph2+(n1/6)+(n2/3)+(n3/3)+(n4/6);

            v1=sqrt(1.0-(v2*v2));

            u1[i].push_back(v1);
            u2[i].push_back(v2);
            theta[i].push_back(angle);
            phi1[i].push_back(ph1);
            phi2[i].push_back(ph2);
        }


}

}

解决方案

I think you should compile your programs in release modus to enable compiler optimization. odeint uses lots of template code which is quite slow when compiled in debug modus. The performance will be increaced by orders of magnitude in release modus.

这篇关于odeint内存使用和执行时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆