루프를 스위칭하지 않다
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로 도입되었습니다.
레퍼런스
- ^ Cooper, Keith; Torczon, Linda (2004). Engineering a Compiler. ISBN 9781558606982.
- ^ "GCC 3.4 Release Series — Changes, New Features, and Fixes - GNU Project".