저는 C++로 2D 수치 모델을 개발하고 있습니다. 코드 속도를 늦추는 특정 멤버 함수의 속도를 높이고 싶습니다. 이 함수는 모델의 모든 i,j
격자 점을 반복하고 모든 격자 점에서 l
및 m
을 초과하는 값으로 이중 합계를 수행해야합니다. 함수는 다음과 같습니다 :4 중첩 된 "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];
}
은 아마도 더 나은 것 :
편집 1 : 다음과 같이
다섯 개 배열 내 클래스의 생성자에서 할당?
루프 순서를 변경해도 복잡성은 줄어들지 않습니다. 실제로 작업 속도를 높이려면 여러 프로세스 나 스레드간에 작업을 나눌 수 있지만 오버 헤드가 있습니다. – JGroven
배열은 어떻게 정의되어 있습니까? 데이터의 캐시 기능을 향상시킬 수 있습니다. – user4581301
2D 그리드 위에 2D 필터를 전달하는 것처럼 들립니다. 따라서 KissFFT를 사용하여 주파수 도메인으로 변환하고, convolve 한 다음 다시 공간 도메인으로 변환하십시오. –