gpt4 book ai didi

c++ - 为什么我程序中这个简单的部分让我震惊了两个多小时?

转载 作者:太空狗 更新时间:2023-10-29 23:51:23 24 4
gpt4 key购买 nike

我在下面粘贴了我的程序的一部分,为什么执行需要花费大量时间?

for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j<i) {
pot[i]+=-(x[i]-x[j])*1./pow((pow(x[i]-x[j],2.)+ blah blah,1.5);
}
if(j>i) {
pot[i]+=(x[i]-x[j])*1./pow((pow(x[i]-x[j],2.)+blah blah,1.5);
}
}
}

它已经运行了将近两个小时,如果我将任何一个 1.5 设置为 1.4 那么一切都会好起来的。

下面的那个工作得非常好

for(i=0;i<N;i++)
{
pot[i]=0.0;
for(j=0;j<N;j++)
{
if(j<i)
{
pot[i]+=-1.*(x[i]-x[j])/pow(pow(x[i]-x[j],3.)+blah blah,1.);
}
if(j>i)
{
pot[i]+=1.*(x[i]-x[j])/pow(pow(x[i]-x[j],1.)+blah blah,3.);
}
}
}

/* 我的程序中非常需要前一个而不是后一个*/

上面是这个 block 的一部分

for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j<i)
{
pot[i]+=-(x[i]-x[j])*1./pow(fabs(pow(x[i]-x[j],2.)+ g*g*pow(x[i+N]-x[j+N],2.)+ h*h*pow(x[i+2*N]-x[j+2*N],2.)),1.5) ;
}
if(j>i)
{
pot[i]+=(x[i]-x[j])*1./pow(fabs(pow(x[i]-x[j],2.) + g*g*pow(x[i+N]-x[j+N],2.) + h*h*pow(x[i+2*N]-x[j+2*N],2.)),1.5) ;
}
}
}

最佳答案

好吧,如果 N 是 1000,它将执行 pow 两百万次。 pow,在本例中,执行 log,然后是乘法,然后是 exp。这是繁重的代码。

我只是想指出,如果你想知道,编译器优化对这段代码没有帮助,因为程序计数器几乎所有时间都花在 log 上exp.

此外,正如@amon 指出的那样,您可以去掉一次 pow 调用,从而获得两倍的加速。

关于c++ - 为什么我程序中这个简单的部分让我震惊了两个多小时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21529372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com