我正在开发一个2D数值模型,并且我想加快特定成员函数的速度,这会减慢我的代码。该函数需要循环遍历模型中的每个网格点,然后在每个网格点上执行双重求和,范围为l
和m
。功能如下:优化四重嵌套“for”循环
int Class::Function(void) {
double loadingEta;
int i,j,l,m;
//etaLatLen=64, etaLonLen=2*64
//l_max = 12
for (i=0; i<etaLatLen; i++) {
for (j=0; j < etaLonLen; j++) {
loadingEta = 0.0;
for (l=0; l<l_max+1; l++) {
for (m=0; m<=l; m++) {
loadingEta += etaLegendreArray[i][l][m] * (SH_C[l][m]*etaCosMLon[j][m] + SH_S[l][m]*etaSinMLon[j][m]);
}
}
etaNewArray[i][j] = loadingEta;
}
}
return 1;
}
我一直在尝试改变循环顺序来加快速度,但无济于事。任何帮助将非常感激。谢谢!
编辑1:
所有五个数组在我的类的构造函数分配如下:
etaLegendreArray = new double**[etaLatLen];
for (int i=0; i<etaLatLen; i++) {
etaLegendreArray[i] = new double*[l_max+1];
for (int l=0; l<l_max+1; l++) {
etaLegendreArray[i][l] = new double[l_max+1];
}
}
SH_C = new double*[l_max+1];
SH_S = new double*[l_max+1];
for (int i=0; i<l_max+1; i++) {
SH_C[i] = new double[l_max+1];
SH_S[i] = new double[l_max+1];
}
etaCosMLon = new double*[etaLonLen];
etaSinMLon = new double*[etaLonLen];
for (int j=0; j<etaLonLen; j++) {
etaCosMLon[j] = new double[l_max+1];
etaSinMLon[j] = new double[l_max+1];
}
也许会更好,如果这些是一维数组,而不是多维?
更改循环顺序不会降低复杂性。如果你想真的加快速度,你可能需要在多个进程或线程之间划分工作,但这也有开销。 – JGroven
你的数组是如何定义的?您可能能够提高数据的缓存能力。 – user4581301
听起来就像你正在2D网格上传递2D滤镜。因此,使用KissFFT转换到频域,进行卷积,然后转换回空间域。 –