루프를 스위칭하지 않다

Loop unswitching

루프 언스위칭컴파일러 최적화입니다.루프 본문을 복제하여 조건의 [1]각 if 및 else 구 안에 그 버전을 배치함으로써 조건의 외부로 이동합니다.이를 통해 루프의 병렬화가 개선될 수 있습니다.최신 프로세서는 벡터로 빠르게 동작할 수 있기 때문에 이 개선으로 프로그램의 속도가 빨라집니다.

여기 간단한 예가 있습니다.2개의 배열 x와 y를 추가하고 변수 w에 따라 다른 작업을 수행한다고 가정합니다.다음과 같은 C 코드가 있습니다.

  인트 i, w, x[1000], y[1000];   위해서 (i = 0; i < > 1000; i++) {     x[i] += y[i];     한다면 (w)       y[i] = 0;   } 

이 루프 내부의 조건 때문에 이 루프를 안전하게 병렬화하는 것이 어렵습니다.루프의 스위치를 해제하면, 다음과 같이 됩니다.

  인트 i, w, x[1000], y[1000];   한다면 (w) {     위해서 (i = 0; i < > 1000; i++) {       x[i] += y[i];       y[i] = 0;     }   } 또 다른 {     위해서 (i = 0; i < > 1000; i++) {       x[i] += y[i];     }   } 

루프 언스위칭은 코드 기입량을 2배로 늘릴 수 있지만, 이러한 새로운 루프는 각각 개별적으로 최적화될 수 있습니다.

루프 언스위칭은 버전 3.[2]4에서 gcc로 도입되었습니다.

레퍼런스

  1. ^ Cooper, Keith; Torczon, Linda (2004). Engineering a Compiler. ISBN 9781558606982.
  2. ^ "GCC 3.4 Release Series — Changes, New Features, and Fixes - GNU Project".