2012-04-09 5 views
5

코드 감안할 때 :루프 줄이기 및 최적화

for (int i = 0; i < n; ++i) 
{ 
    A(i) ; 
    B(i) ; 
    C(i) ; 
} 

그리고 최적화 버전 :

for (int i = 0; i < (n - 2); i+=3) 
{ 
    A(i) 
    A(i+1) 
    A(i+2) 
    B(i) 
    B(i+1) 
    B(i+2) 
    C(i) 
    C(i+1) 
    C(i+2) 
} 

뭔가 나에게 분명하지 않다 : 더 나은 어떤을? 다른 버전을 사용하면 더 빨리 작동하는 것을 볼 수 없습니다. 내가 여기서 뭔가를 놓치고 있니?

내가 보는 모든

은 각 명령 ... 나는 이전 명령 후 일을 시작하기 위해 완료 할 것을 기다릴 필요가 즉, 이전의 명령에 따라

감사

+1

어떤 언어입니까? – Bytemain

+0

Wikipedia에는 ​​루프 풀기에 대한 아이디어가 있습니다. http://en.wikipedia.org/wiki/Loop_unwinding –

+0

일반적으로 이것들은 동일하지 않습니다. A (i) 여야합니다. B (i); C (i); A (i + 1); B (i + 1); – gnasher729

답변

9

언어의 상위 수준보기에서는 최적화를 보지 못합니다. 속도 향상은 컴파일러가 가지고있는 것에서 비롯됩니다.

첫 번째 경우에

, 그것의 같은 :

LOCATION_FLAG; 
DO_SOMETHING; 
DO_SOMETHING; 
DO_SOMETHING; 
TEST FOR LOOP COMPLETION;//Jumps to LOCATION_FLAG if false 
당신은 후자의 경우에서 볼 수

, 테스트 및 점프의 오버 헤드가 아니라 : 두 번째에서

LOCATION_FLAG; 
DO_SOMETHING; 
TEST FOR LOOP COMPLETION;//Jumps to LOCATION_FLAG if false 

이 같은이야 3. 첫 번째 명령은 1 명령 당 1 명령입니다. 그래서 그것은 훨씬 더 자주 발생합니다.

따라서 불변 식 (예 : mod 3 배열)을 사용하면 기본 어셈블리가 더 직접 작성되기 때문에 루프를 푸는 것이 더 효율적입니다.

3

된다는 것이다 글쎄,이 코드가 "더 나은지", "더 나쁜지"여부는 A, BC의 구현에 따라 달라지며 어느 값이 n인지, 어떤 컴파일러를 사용하고 어떤 하드웨어를 실행하고 있는지에 달려 있습니다.

일반적으로 루프 풀기의 이점은 루프를 수행하는 오버 헤드 (즉, i을 증가시키고 n과 비교)가 감소한다는 것입니다. 이 경우 3의 인수로 줄일 수 있습니다.

4

루프 언 롤링은 점프 & 브랜치 명령의 수를 줄이기 위해 사용되어 잠재적으로 루프를 빠르게 할 수 있지만 바이너리 크기를 증가시킵니다. 구현 및 플랫폼에 따라 속도가 빨라질 수 있습니다.

2

함수 A(), B() 및 C()가 동일한 데이터 집합을 수정하지 않는 한 두 번째 버전은 더 많은 병렬화 옵션을 제공합니다.

첫 번째 버전에서는 상호 의존성이 없다고 가정하고 세 가지 기능을 동시에 실행할 수 있습니다. 두 번째 버전에서는 세 개의 모든 함수가 세 개의 데이터 세트를 모두 사용하여 동시에 실행될 수 있습니다. 단 하나의 실행 단위가 충분하고 상호 의존성이 없다고 가정합니다.

0

일반적으로 최적화를 "개발"하려고 시도하지 않는 것이 좋습니다. 단점을 많이 갖게 될 것이라는 확실한 증거가없는 경우가 많습니다. 일반적으로 이러한 증거를 얻는 가장 좋은 방법은 좋은 프로파일 러를 사용하는 것입니다. 이 코드의 두 버전을 프로파일 러로 테스트하여 차이점을 확인합니다.

또한, 여러 번 반복 이전에 언급 한 바와 같이 매우 protable, 그것은 당신이 추가 컴파일러 옵션을 사용하여 재생할 수있는 등 플랫폼, 컴파일러,

에 따라 크게 차이가 밤은 줄이기. 흥미로운 GCC 옵션은 "-funroll - 루프」를 봐, 당신은

편집 또한"-O, -O2, -O3 및 -Os "자동 얻을"-최적화를 -floop "컴파일러입니다 선택권.

+0

또한이 간결하면서도 놀라운 루프 언 롤링 예제를 살펴보십시오. [Duff 's device] (http://en.wikipedia.org/wiki/Duff%27s_device) – Brady