루프 반전
Loop inversion컴퓨터 과학에서 루프 역전은 컴파일러 최적화 및 루프 변환으로, 잠시 루프가 do를 포함하는 if 블록으로 대체된다.고리를 돌면서올바르게 사용할 경우 지시 파이프라인으로 인해 성능이 향상될 수 있다.
C의 예
이 절에는 아마도 독창적인 연구가 포함되어 있을 것이다.(2017년 9월) (이 를 과 시기 |
인트로 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-주소 코드의 예
이 절에는 아마도 독창적인 연구가 포함되어 있을 것이다.(2017년 9월) (이 를 과 시기 |
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(따라서, 두 개의 파이프라인 스톨)가 실행에서 제거되었다.