gpt4 book ai didi

c - 5个嵌套for循环,速度优化

转载 作者:行者123 更新时间:2023-12-03 16:53:27 26 4
gpt4 key购买 nike

我有一段代码可以计算“double **times”的值。假设“时间”的维数为 [nsims][N](使用 malloc.. 创建),其中 int N=40 和 int nsims=50000。

结果存储在“double **moments”中。所以我们有 5 个嵌套的 for 循环。

然而问题是速度,因为这段代码需要运行大约 100 万次。

我已经在使用线程(此处未显示)将最内部的 for 循环拆分为 10 个并行线程,这已经节省了大量时间。

有没有人看到其他优化的可能性,特别是关于不同的数据结构或类似的东西?

即使我没有“interm= ...”公式,它仍然需要太多时间。

for(j=2;j<=N;j++) {     
for(k=j;k<=N;k++) {
moment=0;
for(i=2;i<=N;i++) {
for(l=i;l<=N;l++) {
if(strcmp(mmethod, "emp")==0) {
for(a=0;a<nsims;a++) {
interm=interm + (double) times[a][k] *
times[a][j]*times[a][i] *
times[a][l];
}
interm = (double) interm/nsims;
moment = moment + (interm*i*l);
interm=0;
}
}
}
if(!(changed_times[k]==0
&& changed_times[j]==0
&& changed_times[l]==0
&& changed_times[i]==0))
{
moments[0][pcount]=(double) moment;
} else {
moments[0][pcount]=moments[0][pcount];
}
pcount++;
}
}

最佳答案

注意在你的内部循环中,你是如何查找并乘以 times[a][k]*times[a][j]*times[a][i]每次,即使该表达式对于 a 的每个值都相同.对于乘法和内存查找而言,它可能很昂贵。 (也许编译器足够聪明,可以优化它,我不知道。)不过,您可以尝试在内循环中缓存这些值,如下所示:

  ...
double akji[nsims];
for (a = 0; a < nsims; ++a) { akji[a] = times[a][k]*times[a][j]*times[a][i]; }
for(l=i;l<=N;l++) {
interm=0;
for(a=0;a<nsims;a++) {
interm += akji[a]*times[a][l];
}
moment += (interm*l);
}
moment = moment * i / nsims;
...

关于c - 5个嵌套for循环,速度优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15433587/

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