루프 반전

Loop inversion

컴퓨터 과학에서 루프 역전컴파일러 최적화루프 변환으로, 잠시 루프do를 포함하는 if 블록으로 대체된다.고리를 돌면서올바르게 사용할 경우 지시 파이프라인으로 인해 성능이 향상될 수 있다.

C의 예

  인트로 i, a[100];   i = 0;   하는 동안에 (i < 100) {     a[i] = 0;     i++;   } 

다음 항목과 동일하다:

  인트로 i, a[100];   i = 0;   만일 (i < 100) {     하다 {       a[i] = 0;       i++;     } 하는 동안에 (i < 100);   } 

두 번째 사례의 더 복잡해 보이는 것에도 불구하고, 현대 CPU명령 파이프라인을 사용하기 때문에 실제로 더 빨리 실행될 수 있다.본질적으로, 코드의 점프는 파이프라인 스톨을 유발하는데, 이것은 성능에 손상을 준다.

또한 루프 역전은 안전한 루프 내 변위 코드 동작을 허용한다.

3-주소 코드의 예

i := 0 L1: i >= 100 goto L2 a[i] := 0 i := i + 1 goto L1 L2:

100에서 초기화된 경우 런타임에 실행된 지침은 다음과 같았을 것이다.

i >=100이면goto L2

100 미만의 값으로 초기화되었다고 가정해 봅시다.이제 루프에서 99로 증가된 후 현재 실행 중인 지침을 살펴봅시다.

goto L1만약 내가 < 100>a[i] := 0i :=i + 1goto L1i >=100이면goto L2<<L2>에서>

이제 최적화된 버전을 살펴봅시다.

i :=0= 100 goto L2 L1: a[i] : 0 i := i + 1 만약 100 goto L1 L2:

다시 100으로 초기화된 경우 실행된 지침을 살펴봅시다.

i >=100이면goto L2

우리는 오리지널 버전에 비해 어떤 사이클도 낭비하지 않았다.이제 99로 증가된 경우를 생각해 보십시오.

만약 내가 < 100>goto L1a[i] := 0i :=i + 1만약 내가 < 100><<L2>에서>

보시다시피 두 개의 goto(따라서, 두 개의 파이프라인 스톨)가 실행에서 제거되었다.