我正在開發一個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轉換到頻域,進行卷積,然後轉換回空間域。 –