2016-07-29 2 views
0

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 체크 또는 이러한 시나리오를 구현하는 더 좋은 방법을 피하는 방법은 무엇입니까?

+0

나는이 질문을 "너무 광범위하게"라고 부릅니다. 완전한 정반대를 말하는 두 가지 대답은 아마도 유효 할 것입니다. 여기에 우리의 상상력이 너무 많이 남아 있습니다. 예를 들어,'var'이 변경되지 않는다고 말하면, 이름이 붙은 상수인가, 아니면'volatile' 속성을 가지고 있습니까? 컴파일러가 문제를 해결할 수 있는지 여부는 컴파일러에 따라 다릅니다. 컴파일러가 종속되어 있는지 여부는 컴파일 플래그에 달려 있으며 코드가 어떻게 배치되어 있는지에 따라 다릅니다. 그리고 이점은 아키텍처 및 분기 예측에 따라 달라질 수 있습니다. 등등. 나는 당신이 당신 자신의 완전한 예를 쓰고 그것의 윤곽을 그릴 것을 제안한다. – francescalus

+0

변수'var'는 상수로 정의되어 있지 않습니다. 그러나 입력 파일에서 읽습니다. 그리고'var'의 범위는 프로그램 전체에서 수정되지 않았습니다. –

답변

0
do x=1,nx 
    do y=1,ny 
    if (var == 1) 
     do z=1,nz 
     function1(x,y,z) 
     end do 
    else if (var == 2) 
     do z=1,nz 
     function2(x,y,z) 
     end do 
    endif 
    end do 
end do 
+0

이것이 논리적 인 해결책이라는 것을 알고 있습니다. 그러나 '기능'자체는 매우 길며 다른 많은 기능을 수행합니다. 'if' 체크는 단지'function'의 작은 구성 요소입니다. 따라서 두 함수를 작성하면 불필요하게 코드 길이가 늘어납니다. 다른 제안? –

+1

@SathishKrishnan 함수가 매우 길면'if'를 피할 수있는 포인트가 없습니다. 이것은 쓸모없는 미세 최적화입니다. –