Fortran 프로그램이 있습니다.루프 독립 변수에 대한 컴파일러 최적화
가 여기에do x=1,nx
do y=1,ny
do z=1,nz
function(x,y,z)
end do
end do
end do
function(x,y,z)
if(var==1)
! do something
else if(var==2)
! do something else
end if
end
변수 var
이 프로그램의 시작 부분에 입력 파일에서 읽기 및 실행 과정에서 변경되지 않습니다 : 의사 코드는 다음과 같이 다음과 같습니다. 나는 if
체크가 for/do
루프의 깊숙한 곳에 있다는 것을 읽었을 때, "캐시 효과"를 무시함으로써 성능을 떨어 뜨릴 수 있다고 읽었습니다. 변수가 변경되지 않으므로 컴파일러가 캐시 효과의 이점을 볼 수 있도록 코드를 재정렬 할 수 있습니까?
그런 경우가 아니면 if
체크 또는 이러한 시나리오를 구현하는 더 좋은 방법을 피하는 방법은 무엇입니까?
나는이 질문을 "너무 광범위하게"라고 부릅니다. 완전한 정반대를 말하는 두 가지 대답은 아마도 유효 할 것입니다. 여기에 우리의 상상력이 너무 많이 남아 있습니다. 예를 들어,'var'이 변경되지 않는다고 말하면, 이름이 붙은 상수인가, 아니면'volatile' 속성을 가지고 있습니까? 컴파일러가 문제를 해결할 수 있는지 여부는 컴파일러에 따라 다릅니다. 컴파일러가 종속되어 있는지 여부는 컴파일 플래그에 달려 있으며 코드가 어떻게 배치되어 있는지에 따라 다릅니다. 그리고 이점은 아키텍처 및 분기 예측에 따라 달라질 수 있습니다. 등등. 나는 당신이 당신 자신의 완전한 예를 쓰고 그것의 윤곽을 그릴 것을 제안한다. – francescalus
변수'var'는 상수로 정의되어 있지 않습니다. 그러나 입력 파일에서 읽습니다. 그리고'var'의 범위는 프로그램 전체에서 수정되지 않았습니다. –