请各位大神帮忙看一下一个小程序,如何提高运算效率,必有重谢!!!

leadercqf 2016-02-05 03:55:12
我是物理专业的,这是我的一个科研项目中需要做的计算,是用蒙特卡洛模拟ising model的相变温度,在之前也写过类似的程序,但是计算比这个简单,所以能顺利得到结果,但是现在算的这个一直都在运行状态,算不出结果。 本人不是软件专业的所以不知道如何能改进,希望各大神能帮帮忙,我不是伸手党,大神们可以只是指点迷津。但是能帮我更具体地修改一下就更好啦谢谢谢谢!!!! 能做下去也许能发个paper(ps:上万次循环是计算需要的,因为想要更精确的结果)如果需要知道各个变量具体是拿来干嘛的话可以提出来,好心的大神可以加qq383119913详细讨论!!过年了有重谢!!

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int n = 8,s[8][8][8],i,II,j,k,k1,M1[50000],m=0;
double esum,esum1,esum2=0,e,e1,e2,e3=0,iseed,C1=0,E1[50000],t,m1=0;srand((unsigned)time(NULL));
int (*p)[8][8];
p = s;
for (i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<=n-1;k++)
{
*(*(*(p+i)+j)+k)=1;
}
}
}

t=5;
for(k=0;k<15000;k++)
{
/****/
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<8;k++)
{
esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t;
if(k==0) esum2 = 0.5*s[i][j][0]*s[(i+1)&7][j][5]/t;
if(k==1) esum2 = 0.5*s[i][j][1]*s[(i+1)&7][j][4]/t;
if(k==2) esum2 = 0.5*s[i][j][2]*s[i][(j+1)&7][7]/t;
if(k==3) esum2 = 0.5*s[i][j][3]*s[i][(j+1)&7][6]/t;
if(k==4) esum2 = 0.5*s[i][j][4]*s[(i-1)&7][j][1]/t;
if(k==5) esum2 = 0.5*s[i][j][5]*s[(i-1)&7][j][0]/t;
if(k==6) esum2 = 0.5*s[i][j][6]*s[i][(j-1)&7][3]/t;
if(k==7) esum2 = 0.5*s[i][j][7]*s[i][(j-1)&7][2]/t;
esum = esum1 + esum2;
iseed=(rand()%10000)*0.0001;
if(iseed<=exp(esum))
{
s[i][j][k]=-s[i][j][k];
}
}
}
//****一次扫描/*
}
}
m = 0;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<8;k++)
{
m=m+s[i][j][k];
}
}
}
esum = 0;
for(k1=0;k1<50000;k1++)
{
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<8;k++)
{
if(k==0) esum2 = 0.5*s[i][j][0]*s[(i+1)&7][j][5]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==1) esum2 = 0.5*s[i][j][1]*s[(i+1)&7][j][4]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==2) esum2 = 0.5*s[i][j][2]*s[i][(j+1)&7][7]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==3) esum2 = 0.5*s[i][j][3]*s[i][(j+1)&7][6]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==4) esum2 = 0.5*s[i][j][4]*s[(i-1)&7][j][1]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==5) esum2 = 0.5*s[i][j][5]*s[(i-1)&7][j][0]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==6) esum2 = 0.5*s[i][j][6]*s[i][(j-1)&7][3]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==7) esum2 = 0.5*s[i][j][7]*s[i][(j-1)&7][2]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
iseed=(rand()%10000)*0.0001;
if(iseed<=exp(esum))
{
s[i][j][k]=-s[i][j][k];
m = m + 2*s[i][j][k];
}
}
}
//****一次扫描/*
}
e=0;
e1=0;
e2=0;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
e1 = -(s[i][j][1]*s[i][j][2] + s[i][j][2]*s[i][j][3] + s[i][j][3]*s[i][j][4] + s[i][j][4]*s[i][j][5] + s[i][j][5]*s[i][j][6] + s[i][j][6]*s[i][j][7] + s[i][j][7]*s[i][j][0]+ s[i][j][0]*s[i][j][1]);
e2 = -0.25*(s[i][j][0]*s[(i+1)&7][j][5]+s[i][j][1]*s[(i+1)&7][j][4]+s[i][j][2]*s[i][(j+1)&7][7]+s[i][j][3]*s[i][(j+1)&7][6]+s[i][j][4]*s[(i-1)&7][j][1]+s[i][j][5]*s[(i-1)&7][j][0]+s[i][j][6]*s[i][(j-1)&7][3]+s[i][j][7]*s[i][(j-1)&7][2]);
e = e1 + e2;
}
}
M1[k1] = abs(m/512);
E1[k1] = e;
}
for (k1=0;k1<50000;k1++)
{
e3 = e3 + E1[k1];
m1 = m1 + M1[k1];
C1 = C1 + (E1[k1]*E1[k1]);
}
e3 = e3/50000;
m1 = m1/50000;
C1 = (C1/50000 - e3*e3)/(t*t);
printf("%lf\n%lf\n%lf\n",C1,e3,m1);

}

...全文
174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-02-06
  • 打赏
  • 举报
回复
 for(k=0;k<15000;k++)//这地方是否有错误?
        {
            /****/
            for(i=0;i<=n-1;i++)
            {
                for(j=0;j<=n-1;j++)
                {
                    for(k=0;k<8;k++)
改成

for(k1=0;k1<15000;k1++)//这地方是否有错误?
        {
            /****/
            for(i=0;i<=n-1;i++)
            {
                for(j=0;j<=n-1;j++)
                {
                    for(k=0;k<8;k++)
只要6~7秒就可以了,应该可以更快
lm_whales 2016-02-05
  • 打赏
  • 举报
回复
for(k=0;k<15000;k++)//这地方是否有错误? { /****/ for(i=0;i<=n-1;i++) { for(j=0;j<=n-1;j++) { for(k=0;k<8;k++)
lm_whales 2016-02-05
  • 打赏
  • 举报
回复
感觉你这个从头设计比修改要好
paschen 2016-02-05
  • 打赏
  • 举报
回复
首先从宏观上优化,能用更好的算法就用更好的 然后再从细部优化,你看下你程序是否方便用并行运算,这样可以提高效率 优化了这些还是觉得慢,可以用profier测试一下,看是哪一部分是瓶颈,然后再对这一部分想办法
lm_whales 2016-02-05
  • 打赏
  • 举报
回复
if(k==0) esum2 = 0.5*s[i][j][0]*s[(i+1)&7][j][5]/t; if(k==1) esum2 = 0.5*s[i][j][1]*s[(i+1)&7][j][4]/t; if(k==2) esum2 = 0.5*s[i][j][2]*s[i][(j+1)&7][7]/t; if(k==3) esum2 = 0.5*s[i][j][3]*s[i][(j+1)&7][6]/t; if(k==4) esum2 = 0.5*s[i][j][4]*s[(i-1)&7][j][1]/t; if(k==5) esum2 = 0.5*s[i][j][5]*s[(i-1)&7][j][0]/t; if(k==6) esum2 = 0.5*s[i][j][6]*s[i][(j-1)&7][3]/t; if(k==7) esum2 = 0.5*s[i][j][7]*s[i][(j-1)&7][2]/t; 这个可以改成一次比较

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧